Sử dụng redux-thunk
:
class PostIndex extends React.Component {
componentDidMount() {
const { dispatch } = this.props;
dispatch(getPosts());
}
...
}
function fetchPosts() {
return dispatch => {
fetchPostsAjax()
.then(res => {
dispatch({ type: 'RECEIVE_POSTS', payload: res });
dispatch(fetchPostMeta(res));
})
}
}
function fetchPostMeta(posts) {
return dispatch => {
fetchPostMetaAjax(posts)
.then(res => dispatch({ type: 'RECEIVE_POST_META', payload: res }));
}
}
}
function fetchPostAjax() {
// return a promise, whether from jQuery.ajax or fetch
}
function fetchPostMetaAjax() {
// return a promise
}
Đây là một tình huống khá chuẩn cho redux-thunk
. Ví dụ trên được phục vụ theo cách bạn đặt câu hỏi, nhưng bạn có thể thực hiện việc này trong một người tạo hành động đơn lẻ trông giống như ví dụ redux-thunk
được cung cấp tại đây: http://redux.js.org/docs/advanced/AsyncActions.html
Điều khác biệt là trong ví dụ của tôi gửi một thunk bên trong một thunk, chứ không phải là làm nhiệm vụ thứ hai trực tiếp bên trong của thunk đầu tiên. Vì vậy, giá trị tương đương như sau:
function fetchPosts() {
return dispatch => {
fetchPostsAsync()
.then(res => { // res is posts
dispatch({ type: 'RECEIVE_POSTS', payload: res });
return fetchPostMetaAsync(res);
})
.then(res => { // res is metadata
dispatch({ type: 'RECEIVE_POST_META', payload: res });
})
}
}
Bạn sẽ không gặp phải bất kỳ điều kiện chủng tộc bởi vì khi bạn gửi một hành động như { type: RECEIVE_POSTS, payload: res }
, nó là đồng bộ và cập nhật giảm tốc trước khi bạn cử hành động async sau.
Nguồn
2015-10-26 16:44:44
Vâng, điều đó có vẻ hoạt động hoàn hảo và có ý nghĩa. Cảm ơn! Tôi đã làm nó giống như ví dụ thứ hai bạn chỉ cung cấp thay thế 'then' bằng' $ .ajax ({... success: function (result) {...}}) của jQuery. Ngoài ra, bạn có một cuộc gọi lặp lại 'fetchPosts()' trong ví dụ đầu tiên của bạn, có thể muốn chỉnh sửa lệnh đầu tiên thành 'getPosts()' để nó dễ hiểu hơn. Cảm ơn bạn lần nữa! – liorbrauer
Cảm ơn bạn đã chỉ ra điều đó! Tôi đã sửa nó. Tôi nghĩ rằng ví dụ thứ hai là thành ngữ hơn và hứa hẹn rất thú vị như vậy: thumbsup: –