redux-saga何时使用fork?

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

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,什么时候不需要?

回答:

通常,fork当传奇需要启动非阻塞任务时很有用。这里的非阻塞意味着:调用方启动任务并继续执行,而无需等待任务完成。

在许多情况下这可能有用,但主要有2种情况:

  • 按逻辑域对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传奇式takeEvery电话进行通话。但是实际上,您仅需要出于代码组织目的执行此操作。takeEvery这本身就是一项分叉的任务,因此在大多数情况下,这将毫无用处。

第二个用例的示例如下:

yield take(USER_WAS_AUTHENTICATED);

const task = yield fork(monitorUserProfileUpdates);

yield take(USER_SIGNED_OUT);

yield cancel(task);

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

为了完整起见,还有另一种开始非阻塞调用的方式:spawnfork并且spawn在错误和取消从子级到父级传奇的冒泡方式上有所不同。

以上是 redux-saga何时使用fork? 的全部内容, 来源链接: utcz.com/qa/427045.html

回到顶部