我有以下代码通过实现promises获取一些数据。
var TreeDataService = new DataService();
export default class TreeStore {
treeData = [];
getData() {
TreeDataService.get().then(data => {
this.treeData = data;
},
() => {
alert("Error fetching data");
});
return this.treeData; //this returns empty array instead of returning the data fetched from TreeDataService.get
}
}
如何在承诺完全解决后才能执行return this.treeData
?我知道我可以将return this.treeData
放在那个成功方法中,并将整个getData
方法作为承诺返回,但这需要在getData
的调用站点再次解析承诺。
export default class App extends React.Component {
treeData = TreeStoreObj.getData().then(data => {
return data;
}); // This will also execute asynchronously, so will be initially empty.
render() {
return (
<div className="app-container">
<TreeNode node={this.treeData} /> // So this will also be empty
</div>
);
}
}
现在的早期代码是:
export default class TreeStore {
treeData = [];
return getData() {
TreeDataService.get().then(data => {
return this.treeData = data;
},
() => {
alert("Error fetching data");
});
}
}
答案 0 :(得分:1)
异步模型不允许您在解析承诺后执行return this.treeData
。但是,您可能希望缓存承诺,不要多次调用TreeDataService.get()
。
例如(未经测试,只是试图展示主要想法):
export default class TreeStore {
treeData = [];
treeDataPromise = null;
getData() {
if (this.treeDataPromise) return this.treeDataPromise;
this.treeDataPromise = TreeDataService.get().then(data => {
this.treeData = data;
return this.treeData;
},
() => {
alert("Error fetching data");
});
return this.treeDataPromise;
}
}
另一种选择是检查是否加载了this.treeData
,如果是这种情况,则返回Promise.resolve(this.treeData)
。
答案 1 :(得分:1)
你做的事情很奇怪。如果您使用mobx,getData
根本不应返回任何值。它应该只设置store observable。当此可观察值更改时,React组件将自动重新呈现。
你使用mobx-react?如果是,请显示您的集成代码。如果没有尝试使用它;)