gpt4 book ai didi

reactjs - redux-saga 何时使用 fork?

转载 作者:行者123 更新时间:2023-12-03 12:57:26 24 4
gpt4 key购买 nike

下面两种方法有什么区别?

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)
]
}

什么时候需要使用 fork,什么时候不需要?

最佳答案

一般来说,当 saga 需要启动非阻塞任务时,fork 非常有用。这里的非阻塞是指:调用者启动任务并继续执行,而不等待它完成。

在很多情况下这都会有用,但主要有两种:

  • 按逻辑域对 sagas 进行分组
  • 保留对任务的引用以便能够取消/加入它

您的顶级传奇可以是第一个用例的示例。您可能会遇到类似的情况:

yield fork(authSaga);
yield fork(myDomainSpecificSaga);
// you could use here something like yield [];
// but it wouldn't make any difference here

其中 authSaga 可能包括以下内容:

yield takeEvery(USER_REQUESTED_LOGIN, authenticateUser);
yield takeEvery(USER_REQUESTED_LOGOUT, logoutUser);

您可以看到这个示例与您建议的等效,使用 fork 调用一个 saga,产生 takeEvery 调用。但实际上,您只需出于代码组织目的而执行此操作。 takeEvery 本身就是一个 fork 任务,因此在大多数情况下,这是毫无用处的冗余。

第二个用例的示例如下:

yield take(USER_WAS_AUTHENTICATED);
const task = yield fork(monitorUserProfileUpdates);
yield take(USER_SIGNED_OUT);
yield cancel(task);

在此示例中您可以看到,monitorUserProfileUpdates 将在调用者传奇恢复时执行,并等待分派(dispatch) USER_SIGNED_OUT 操作。它还可以保留对其的引用,以便在需要时取消它。

为了完整起见,还有另一种方式来启动非阻塞调用:spawnforkspawn 的不同之处在于错误和取消从子传奇冒泡到父传奇的方式。

关于reactjs - redux-saga 何时使用 fork?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42938520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com