兩個問題跳出來:
你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
向我們展示你的渲染() –