以下
如何在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])。如果要渲染子级集合,请改用数组。
我执行不正确吗?
跳出两个问题:
您getData
从不返回任何东西,因此其诺言(async
函数始终会返回诺言)在解决undefined
时将与之同时解决
错误消息清楚地表明您正在尝试直接呈现承诺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>
);
}
}
进一步更新: 您已指示首选使用await
in
componentDidMount
而不是then
和catch
。您可以通过在其中嵌套async
IIFE函数并确保该函数不会抛出来实现。(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。其他值将自动被