只有在承诺被解决后才执行函数语句
Execute function statement only after promise is resolved
我有以下代码,它通过实现承诺来获取一些数据。
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
仅在 promise 完全解决后才执行?我知道我可以将 return this.treeData
放入 then 的成功方法和 return 整个 getData
方法作为承诺,但这将需要在 getData
的调用站点再次解决承诺.
编辑:我知道这是一个异步操作,我不能同步执行 return 语句,而是 return 一个承诺。但是,我如何在呼叫站点解决该承诺?我在调用代码时遇到同样的问题:
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");
});
}
}
异步模型不允许您在承诺解决后执行 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
是否已加载,如果是 return Promise.resolve(this.treeData)
。
你正在做一些奇怪的事情。如果您使用的是 mobx,getData
不应该 return 任何值。它应该只设置商店可观察。当此可观察值发生变化时,React 组件将自动重新呈现。
你在使用 mobx-react 吗?如果是这样,请显示您的集成代码。如果没有尝试使用它 ;)
我有以下代码,它通过实现承诺来获取一些数据。
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
仅在 promise 完全解决后才执行?我知道我可以将 return this.treeData
放入 then 的成功方法和 return 整个 getData
方法作为承诺,但这将需要在 getData
的调用站点再次解决承诺.
编辑:我知道这是一个异步操作,我不能同步执行 return 语句,而是 return 一个承诺。但是,我如何在呼叫站点解决该承诺?我在调用代码时遇到同样的问题:
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");
});
}
}
异步模型不允许您在承诺解决后执行 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
是否已加载,如果是 return Promise.resolve(this.treeData)
。
你正在做一些奇怪的事情。如果您使用的是 mobx,getData
不应该 return 任何值。它应该只设置商店可观察。当此可观察值发生变化时,React 组件将自动重新呈现。
你在使用 mobx-react 吗?如果是这样,请显示您的集成代码。如果没有尝试使用它 ;)