当前位置: 首页 > 面试题库 >

在React.js中将Async / Await与Axios一起使用

督坚白
2023-03-14
问题内容

以下

如何在React中与axios一起使用async /
await

我试图在React.js应用程序中使用Async / Await向我的服务器发出一个简单的get请求。服务器加载一个简单的JSON
/data,看起来像这样

JSON格式

{
   id: 1,
   name: "Aditya"
}

我可以使用简单的jquery ajax get方法将数据获取到我的React App。但是,我想利用axios库和Async /
Await来遵循ES7标准。我当前的代码如下所示:

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])。如果要渲染子级集合,请改用数组。

我执行不正确吗?


问题答案:

跳出两个问题:

  1. getData从不返回任何东西,因此其诺言(async函数始终会返回诺言)在解决undefined时将与之同时解决

  2. 错误消息清楚地表明您正在尝试直接呈现承诺getData回报,而不是等待其解决然后呈现解决方案

寻址#1:getData返回 调用结果json

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

Addressig#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>
        );
    }
}

进一步更新: 您已指示首选使用awaitin
componentDidMount而不是thencatch。您可以通过在其中嵌套asyncIIFE函数并确保该函数不会抛出来实现。(componentDidMount本身不能async,没有东西会消耗那个诺言。)例如:

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>
        );
    }
}


 类似资料:
  • 我有一个安装了ReactJS的NetCore2应用程序。 null VS代码抛出一个错误,告诉我异步只适用于。ts文件。另外,如果我在任何其他函数中使用await,我将得到一个错误,比如。 据我所知,async/await不仅仅是TS...(或者我错了?)。 谢了!

  • 问题内容: 我在ReactJS项目中一直在使用babel的async await。我发现可以方便地与React setState一起使用,我想更好地理解它。考虑以下代码: 我的意图是让异步验证代码在组件更新后运行。而且有效!生成的控制台日志显示: 验证代码仅在handleChange更新状态并呈现新状态后运行。 通常要在状态更新后运行代码,您必须在this.setState之后使用回调。这意味着,

  • 我正在尝试用Async/Await进行一些动态数据建模。我有两个endpoint,第一个将返回对象数组。数组中的这些实体具有从另一个endpoint获取的子实体。 所以我试图实现的结果类似于: 这就是我试图解决这个问题的方法: 我所期待的: 我得到的是: 我不知何故监督了我的承诺.所有链,所以我只是在我的数据对象中获得解析的承诺,有没有关于如何在其中获得普通数据的提示?或者如何将一个数组解析的承诺

  • 我正在尝试编写一个测试,它断言用Async/Await和Axios抛出了特定类型的错误。但是,当我运行我的测试时,我得到以下结果。为什么jest不恰当地拒绝我的承诺?谢啦! 错误:expect(received).Rejects.ToThrow() 预期已收到拒绝承诺,但它解析为ValueBR>Data":“Response",”Status":404} api.js: specialerror.

  • 问题内容: 在循环中使用/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。 这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用/ ,所以我只是想问一下这是否有问题。 问题答案: 确保代码确实有效,但是我很确定它不会执行您期望的功能。它只会触发多个异步调用,但此后函数会立即返回。 顺序阅读 如果要顺序读取文件, 则不能使用。只需使用现代循环即可,该循环将按预

  • Async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。 Async function 让我们以 async 这个关键字开始。它可以被放置在一个函数前面,如下所示: async function f() { return 1; } 在函数前面的 “async” 这个单词表达了一个简单的事情:即这个函数总是返回一个 promise。其他值将自动被