所以我有一段具有竞争条件的代码:
//load token from async and put it in redux's state
AsyncStorage.getItem('token').then((data) => {
setTimeout(() => {
if (data !== null) {
store.dispatch({ type: t.LOGGED_IN, token: data }); //THIS
this.setState({ isReady: true, isLoggedIn: true }); //RACING THIS
}
else {
store.dispatch({ type: t.LOGGED_OUT });
this.setState({ isReady: true, isLoggedIn: false })
}
}, 5000)
});
所以我做了一些关于如何将我的调度包装在一个承诺中的阅读,这样只有在调度完成后我才会在承诺的setState
内调用.then
。
但是,我无法理解使用promise的resolve
回调。它是否被称为whatevever我传入resolve
然后当它完成它告诉promise对象它已被解决?或者它是说,一旦承诺得到解决,运行那段代码?前者对我更有意义所以我这样做是为了我的代码:
let promisedDispatch = (actionObj) => new Promise (function(resolve) { resolve(store.dispatch(actionObj)) });
//load token from async and put it in redux's state
AsyncStorage.getItem('token').then((data) => {
setTimeout(() => {
if (data !== null) {
promisedDispatch({ type: t.LOGGED_IN, token: data })
.then(()=>this.setState({ isReady: true, isLoggedIn: true }))
}
else {
store.dispatch({ type: t.LOGGED_OUT });
this.setState({ isReady: true, isLoggedIn: false })
}
}, 5000)
});
现在在这种情况下,我真的解决了我的问题吗?
我无法确定,因为即使在此修改之前,竞争条件真的很少给我带来任何问题,因为dispatch
和setState
大致相同的时间,因此调度几乎总是先完成。
了解我的唯一方法是确认resolve(<x>)
是否在说“嘿尝试解决然后让承诺知道什么时候完成”或者我的理解是完全错误的。
提前感谢您的信息! :)