Ở đây bạn có ví dụ về cách gửi và chuỗi hành động không đồng bộ. https://github.com/gaearon/redux-thunk
Phần mềm trung gian thunk biết cách biến hành động không đồng bộ thành hành động, vì vậy bạn chỉ cần có simple_action() là một đoạn và phần mềm trung gian sẽ thực hiện công việc cho bạn, nếu phần mềm trung gian nhìn thấy hành động bình thường , anh ta sẽ gửi hành động này như một hành động bình thường nhưng nếu đó là một chức năng không đồng bộ, nó sẽ biến hành động không đồng bộ của bạn thành hành động bình thường.
Vì vậy simple_action của bạn cần phải là một thunk (A thunk là một hàm trả về một hàm.) Như thế này ví dụ:
function makeASandwichWithSecretSauce(forPerson) {
return function (dispatch) {
return fetchSecretSauce().then(
sauce => dispatch(makeASandwich(forPerson, sauce)),
error => dispatch(apologize('The Sandwich Shop', forPerson, error))
);
};
}
Khi sử dụng chức năng makeASandwichWithSecretSauce bạn có thể sử dụng chức năng văn
store.dispatch(
makeASandwichWithSecretSauce('Me')
);
Và thậm chí
// 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!');
});
Dưới đây là một ví dụ hoàn chỉnh về cách bạn có thể viết người tạo hành động gửi hành động và hành động không đồng bộ từ những người tạo hành động khác và xây dựng luồng kiểm soát của bạn bằng Lời hứa.
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"
}
// sử dụng
store.dispatch(
makeSandwichesForEverybody()
).then(() =>
console.log("Done !");
);
Để tạo bạn sở hữu hứa hẹn bạn có thể sử dụng một thư viện như bluebird.
// EDIT: Để đảm bảo rằng cửa hàng đã xử lý hoàn toàn hành động đó trước khi bất kỳ điều gì khác xảy ra trong hàm action_creator(), bạn có thể gửi đơn giản này trước action_creator(); // Tôi đã thêm nhận xét này vào mã //Do this action before starting the next one below
Đối với tôi đây không phải đang làm việc. Nếu tôi muốn gọi 'then' sau' store.dispatch() 'tôi nhận được một' TypeError: Không thể đọc thuộc tính 'sau đó' của undefined'. Hành động của tôi chắc chắn trả về một lời hứa. – TylerDurden
bạn đã đăng ký phần mềm trung gian điều chỉnh chưa? https://github.com/gaearon/redux-thunk Cài đặt phần – Aaleks
bạn đã đăng ký phần mềm trung gian chưa? Bạn có thể cung cấp một số mã để xem vấn đề có thể ở đâu không? – Aaleks