Итак, у меня есть этот фрагмент кода с условием гонки:
//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
.
Однако я не мог понять, как использовать обратный вызов resolve
для обещания. Вызывает ли это то, что я передаю в resolve
, тогда, когда это сделано, оно сообщает объекту обещания, что оно разрешено? Или это говорит о том, что, как только обещание решено, запустите этот кусок кода? Первое имеет больше смысла для меня, поэтому я сделал это с моим кодом:
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>)
говорит: «Эй, попробуйте решить, а затем сообщите об этом обещание, когда оно будет выполнено», или если мое понимание совершенно неверно.
Заранее спасибо за информацию! :)