两个问题跳出来:
你getData
从不返回任何东西,所以它的Promise(async
函数总是返回一个Promise)undefined
如果它不拒绝就会得到满足
错误消息清楚地表明您正在尝试直接呈现PromisegetData
返回,而不是等待它解决然后呈现履行值
解决 #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>
);
}
}
进一步更新:您已表示偏好使用await
incomponentDidMount
而不是then
and catch
。您可以通过在其中嵌套一个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>
);
}
}