我正在遇到看似可能是竞争条件的事情。基本上,我有一个登录呼叫,当它失败时将调用失败回调。这个失败回调(回调A)依次使用它自己的回调(回调B)调用一个函数。我所看到的是回调中的道具A在回调B之前有一个值,但是一旦回调B正在执行,它们的值已经改变为我预期的值。让我用一些伪代码来说明这一点:
login() {
this.props.loginActions.login(this.failureCallback.bind(this))
}
在loginActions
:
login(failureCallback) {
return (dispatch, getState) {
dispatch({
types: [LOGIN_REQUEST, LOGIN_FAILURE, LOGIN_SUCCESS]
failure: () => failureCallback()
});
};
}
然后,回到主屏幕,一旦我们失败,我就有这样的事情:
failureCallback() {
// A
const wasFail = this.props.isFail // This is false here, even though
// the LOGIN_FAILURE action is properly setting it to true
if (wasFail) {
// do stuff
}
functionWithCallback(() => {
if (wasFail) {
// B
// do stuff
}
}
}
functionWithCallback(callback) {
// C
this.setState({...state, newStuffHere}, callback);
// D
}
我正在做的是在mapStateToProps
,componentWillReceiveProps
上添加日志,然后在A
,B
和C
上添加日志语句。我所看到的是以下内容:
使用正确的值
登录B在我看来发生的事情是,在调度动作的时候,React只知道回调A.所以,在给我的组件新的道具之前,它调用回调A.回调A然后调用回调B.回调A完成后,将调用componentWillReceiveProps,而仍未调用回调B.因此,当调用回调B时,组件现在使用正确的道具进行更新。
这对其他人来说是否正确?这是一个我面临的复杂问题,我试图在消除复杂性的同时尽力说明它。
我还有一点要做,这三种类型是中间件的一部分,我们必须同时调度多个动作,基本上如果请求失败,它将正确地调度动作,如果请求成功,它将正确发送成功。从我所知道的,这是有效的,但是,如果我上面描述的情况不是React的行为,我可以尝试提供有关我们的中间件正在做什么的更多信息。