json 在React.js中使用Axios的Async/Await

pb3s4cty  于 2023-10-21  发布在  React
关注(0)|答案(4)|浏览(126)

以下

How to use async/await with axios in react

我尝试在React.js应用程序中使用Async/Await向我的服务器发出一个简单的get请求。服务器在/data上加载一个简单的JSON,如下所示

JSON

{
   id: 1,
   name: "Aditya"
}

我可以使用简单的jQuery Ajax get方法将数据获取到我的React App。但是,我想利用axios库和Async/Await来遵循ES 7标准。我现在的代码看起来像这样:

class App extends React.Component{
 async getData(){
     const res = await axios('/data');
     console.log(res.json());
 }
 render(){
     return(
         <div>
             {this.getData()}
         </div>
     );
 }
}

使用这种方法,我得到以下错误:
对象作为React子对象无效(找到:[object Promise])。如果你想呈现一个子元素的集合,请使用数组。
我没有正确地执行它吗?

q43xntqr

q43xntqr1#

const datasend = async () => {
    await axios.post(
      "http://localhost:5000/",
      {
        name: named,
        age: aged,
      },
      (response) => {
        console.log(response);
      }
    );
    console.log("data send");
  };
5w9g7ksd

5w9g7ksd2#

两个问题跳出来:
1.您的getData从不返回任何内容,因此如果undefined不拒绝,它的promise(async函数总是返回promise)将由undefined实现
1.错误消息清楚地表明,您试图直接呈现promise getData返回的值,而不是等待它稳定下来,然后呈现fulfillment值
地址#1:getData应该 * 返回 * 调用json的结果:

async getData(){
   const res = await axios('/data');
   return await res.json();
}

地址#2:我们必须看到更多的代码,但从根本上说,

<SomeElement>{getData()}</SomeElement>

……因为这不需要等待决议。你需要使用getData来设置状态:

this.getData().then(data => this.setState({data}))
              .catch(err => { /*...handle the error...*/});

.并在渲染时使用该状态:

<SomeElement>{this.state.data}</SomeElement>

更新:现在你已经向我们展示了你的代码,你需要做 * 这样的事情 *:

class App extends React.Component{
    async getData() {
        const res = await axios('/data');
        return await res.json(); // (Or whatever)
    }
    constructor(...args) {
        super(...args);
        this.state = {data: null};
    }
    componentDidMount() {
        if (!this.state.data) {
            this.getData().then(data => this.setState({data}))
                          .catch(err => { /*...handle the error...*/});
        }
    }
    render() {
        return (
            <div>
                {this.state.data ? <em>Loading...</em> : this.state.data}
            </div>
        );
    }
}

**进一步更新:**您已经表示在componentDidMount中使用await而不是thencatch。您可以通过在其中嵌套一个async IIFE函数并确保该函数不会抛出。(componentDidMount本身不能是async,没有什么会消耗这个promise。)

class App extends React.Component{
    async getData() {
        const res = await axios('/data');
        return await res.json(); // (Or whatever)
    }
    constructor(...args) {
        super(...args);
        this.state = {data: null};
    }
    componentDidMount() {
        if (!this.state.data) {
            (async () => {
                try {
                    this.setState({data: await this.getData()});
                } catch (e) {
                    //...handle the error...
                }
            })();
        }
    }
    render() {
        return (
            <div>
                {this.state.data ? <em>Loading...</em> : this.state.data}
            </div>
        );
    }
}
pwuypxnk

pwuypxnk3#

根据我过去几个月的经验,我意识到实现这一目标的最佳方法是:

class App extends React.Component{
  constructor(){
   super();
   this.state = {
    serverResponse: ''
   }
  }
  componentDidMount(){
     this.getData();
  }
  async getData(){
   const res = await axios.get('url-to-get-the-data');
   const { data } = await res;
   this.setState({serverResponse: data})
 }
 render(){
  return(
     <div>
       {this.state.serverResponse}
     </div>
  );
 }
}

如果你试图对click这样的事件发出post请求,那么就在事件上调用getData()函数,并像这样替换它的内容:

async getData(username, password){
 const res = await axios.post('url-to-post-the-data', {
   username,
   password
 });
 ...
}

此外,如果您在组件即将加载时发出任何请求,只需将async getData()替换为async componentDidMount()并更改render函数,如下所示:

render(){
 return (
  <div>{this.state.serverResponse}</div>
 )
}
jq6vz3qz

jq6vz3qz4#

async fetchCatFacts() {
    await axios.get("//localhost:8082/api_v1/orders", {})
        .then((response) => {

          this.catFacts = response.data.data;
          console.log("resp", response.data);
        });

相关问题