两个问题跳出来:
你getData
永远不会返回任何东西,所以它的诺言(async
函数总是返回一个承诺)将与undefined
解决时,它解决了
错误信息清楚地表明你试图直接渲染承诺getData
回报,而不是等待它解决,然后渲染分辨率
寻址#1:getData
应该回调用json
的结果:
async getData(){
const res = await axios('/data');
return 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 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
而不是then
和catch
之间使用await
的偏好。你可以通过在其中嵌入一个async
IIFE函数并确保函数不会抛出。 (componentDidMount
本身不能是async
,没有东西会消耗这个承诺。):
class App extends React.Component{
async getData() {
const res = await axios('/data');
return 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>
);
}
}
代码不足。错误信息非常清楚。检查你的渲染方法。 – dfsq
render()工作得很好,因为我明确提到我可以在使用$ .ajax()时获取详细信息。我应该添加哪些额外的代码?这是使用ES7标准对服务器的简单获取请求。 – Aditya
向我们展示你的渲染() –