我在任何地方都找不到答案。...
我正在尝试使用setState更新应用程序的状态,但是我需要在async
完成后调用setsState
函数。
我可以在await
的回调函数中async
使用setState
函数吗?
setState({foo: bar}, async () => {await doStuff()});
还要假设这可行,我是否可以依靠setState
在调用doStuff
之前完成操作,并且可以依靠doStuff
被await
编辑吗?
答案 0 :(得分:5)
是的,的确可以。异步函数的特殊之处在于它们始终返回Promises,因此对于返回值不重要的函数(例如回调),尤其是可以放心地放入异步函数,它将按预期工作。
更进一步,例如,您甚至可以将异步功能作为componentDidMount
或componentWillReceiveProps
使用(但仍然不能使用render
,它希望返回JSX元素,不是一个承诺)。
答案 1 :(得分:1)
setState的回调仅在状态更新时触发,因此doStaff在状态更新之前不会执行。 您可以将回调定义为异步函数,并在其内部像其他任何函数一样等待。
const setStateAsync = (newState) => {
return new Promise((resolve) => {
setState(newState, resolve);
});
您可以像这样使用它,例如:
async componentDidMount() {
await setStateAsync(newState);
await doStuff()
}