这里有一个关于如何调度和链接异步操作的示例。https://github.com/gaearon/redux-thunk
thunk 中间件知道如何将 thunk 异步动作转换为动作,所以你只需要让你的 simple_action() 成为一个 thunk 并且 thunk 中间件会为你完成这项工作,如果中间件看到一个正常的动作,他会调度这个动作作为正常动作,但如果它是异步函数,它将把你的异步动作变成正常动作。
所以你的 simple_action 需要是一个 thunk (一个 thunk 是一个返回函数的函数。)例如:
function makeASandwichWithSecretSauce(forPerson) {
return function (dispatch) {
return fetchSecretSauce().then(
sauce => dispatch(makeASandwich(forPerson, sauce)),
error => dispatch(apologize('The Sandwich Shop', forPerson, error))
);
};
}
使用 makeASandwichWithSecretSauce 函数时,您可以使用调度函数
store.dispatch(
makeASandwichWithSecretSauce('Me')
);
乃至
// It even takes care to return the thunk’s return value
// from the dispatch, so I can chain Promises as long as I return them.
store.dispatch(
makeASandwichWithSecretSauce('My wife')
).then(() => {
console.log('Done!');
});
这是一个完整的示例,说明如何编写动作创建者,从其他动作创建者分派动作和异步动作,并使用 Promises 构建控制流。
function makeSandwichesForEverybody() {
return function (dispatch, getState) {
if (!getState().sandwiches.isShopOpen) {
// You don’t have to return Promises, but it’s a handy convention
// so the caller can always call .then() on async dispatch result.
return Promise.resolve();
}
//Do this action before starting the next one below
dispatch(simple_action());
// We can dispatch both plain object actions and other thunks,
// which lets us compose the asynchronous actions in a single flow.
return dispatch(
makeASandwichWithSecretSauce('My Grandma')
).then(() =>
Promise.all([
dispatch(makeASandwichWithSecretSauce('Me')),
dispatch(makeASandwichWithSecretSauce('My wife'))
])
).then(() =>
dispatch(makeASandwichWithSecretSauce('Our kids'))
).then(() =>
dispatch(getState().myMoney > 42 ?
withdrawMoney(42) :
apologize('Me', 'The Sandwich Shop')
)
);
};
}
//apologize and withdrawMoney are simple action like this for example
return {
type: "END_SUCESS"
}
//用法
store.dispatch(
makeSandwichesForEverybody()
).then(() =>
console.log("Done !");
);
要创建自己的 Promise,您可以使用 bluebird 之类的库。
//编辑:为了确保在函数 action_creator() 中发生任何其他事情之前商店已经完全处理了该动作,您可以在 action_creator() 之前调度这个 simple_action;// 我在代码中添加了这个注释//Do this action before starting the next one below