Nói chung, fork
là hữu ích khi một câu chuyện cần khởi động tác vụ không chặn. Không chặn ở đây có nghĩa là: người gọi bắt đầu nhiệm vụ và tiếp tục thực hiện mà không phải chờ nó hoàn thành.
Có một loạt các tình huống nơi này có thể hữu ích, nhưng 2 cái chính là:
- saga nhóm của miền logic
- giữ một tham chiếu đến một nhiệm vụ để có thể để hủy/tham gia nó
Saga cấp cao nhất của bạn có thể là ví dụ về trường hợp sử dụng đầu tiên. Bạn rất có thể sẽ có một cái gì đó như:
yield fork(authSaga);
yield fork(myDomainSpecificSaga);
// you could use here something like yield [];
// but it wouldn't make any difference here
đâu authSaga
khả năng sẽ bao gồm những thứ như:
yield takeEvery(USER_REQUESTED_LOGIN, authenticateUser);
yield takeEvery(USER_REQUESTED_LOGOUT, logoutUser);
Bạn có thể thấy rằng ví dụ này là tương đương với những gì bạn đề nghị, kêu gọi với fork
một saga năng suất một takeEvery
cuộc gọi. Nhưng trong thực tế, bạn chỉ cần làm điều này cho mục đích tổ chức mã. takeEvery
chính nó là một nhiệm vụ chia đôi, vì vậy trong hầu hết các trường hợp, điều này sẽ là vô dụng dư thừa.
Một ví dụ về việc sử dụng hợp thứ hai sẽ là một cái gì đó như:
yield take(USER_WAS_AUTHENTICATED);
const task = yield fork(monitorUserProfileUpdates);
yield take(USER_SIGNED_OUT);
yield cancel(task);
Bạn có thể thấy trong ví dụ này rằng monitorUserProfileUpdates
sẽ thực hiện trong khi saga gọi sơ yếu lý lịch, và được chờ đợi đến USER_SIGNED_OUT
hành động để được gửi đi. Nó có thể ngoài ra giữ một tham chiếu đến nó để hủy bỏ nó khi cần thiết.
Vì mục đích hoàn chỉnh, có một cách khác để bắt đầu cuộc gọi không chặn: spawn
. fork
và spawn
khác nhau về cách lỗi và hủy bong bóng từ câu chuyện con đến phụ huynh.
giải thích tuyệt vời, cảm ơn! –