2017-03-21 19 views
7

Điều gì sẽ là sự khác biệt giữa hai cách tiếp cận bên dưới?redux-saga khi sử dụng ngã ba?

export function* watchLoginUser() { 
    yield takeEvery(USER_LOGIN, loginUser) 
} 
export function* watchLogoutUser() { 
    yield takeEvery(USER_LOGOUT, logoutUser) 
} 
export function* watchGetParties() { 
    yield takeEvery(PARTIES_GET, getParties) 
} 
export default function* root() { 
    yield [ 
    fork(watchLoginUser), 
    fork(watchLogoutUser), 
    fork(watchGetParties) 
    ] 
} 
export default function* root() { 
    yield [ 
    takeEvery(USER_LOGIN, loginUser), 
    takeEvery(USER_LOGOUT, logoutUser), 
    takeEvery(PARTIES_GET, getParties) 
    ] 
} 

Khi nào tôi cần phải sử dụng nĩa và khi không?

Trả lời

15

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. forkspawn khác nhau về cách lỗi và hủy bong bóng từ câu chuyện con đến phụ huynh.

+0

giải thích tuyệt vời, cảm ơn! –

Các vấn đề liên quan