Ответ 1
Здесь у вас есть пример того, как отправлять и переадресовывать асинхронные действия. https://github.com/gaearon/redux-thunk
Средство промежуточного уровня thunk знает, как превратить асинхронные действия thunk в действия, поэтому вам просто нужно, чтобы ваш simple_action() был thunk, а промежуточное ПО thunk выполнит эту работу для вас, если промежуточное программное обеспечение увидит нормальное действие, он отправит это действие как нормальное действие, но если оно будет асинхронным, оно превратит ваше асинхронное действие в нормальное действие.
Итак, ваш simple_action должен быть thunk (A 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 !");
);
Чтобы создать собственный promises, вы можете использовать библиотеку, такую как bluebird.
//EDIT:
Чтобы убедиться, что хранилище полностью обработало это действие, прежде чем что-либо еще произойдет в функции action_creator(), вы можете отправить это simple_action до action_creator();//Я добавил этот комментарий к коду //Do this action before starting the next one below