我使用redux-thunk中间件来调度动作创建者,这些创建者返回函数,而函数本身会调度动作,例如
dispatch(doStuff())
function doStuff(){
return dispatch => {
dispatch(doMoreStuff());
dispatch(doEvenMoreStuff());
// etc.
};
}
这里可能有异步的东西,但至少在开始时它会产生一个同步的动作“堆栈”。因此,用户单击一个按钮,将调度一个动作创建者,该动作创建者触发其他一系列动作。我的减速器可能连续被调用10次。我要做的是,一旦完成该操作及其所有直接后果,就在该链的末尾运行一些特定功能,并在该状态下生成应用程序状态。
一种懒惰的方法是将setTimeout
用在包装我的减速器的东西中:
let timeout;
export default function(state, action) {
const reduced = reducer(state, action);
if (timeout) clearTimeout();
timeout = setTimeout(() => doSomethingWithState(reduced), 0);
return reduced;
}
function reducer(state, action) {
// actual reducer
}
但是,这看起来并不好,并且可能容易出错。最好的方法是什么,在每个动作“堆栈”结束时触发某物,而不是单个动作?