fork
在 redux-saga
是一种非阻塞调用效果,用于创建一个新的 saga
分支,该分支可以同时与父 saga
运行。使用 fork
的场合通常包括以下几点:
-
并发执行任务:当你希望启动一个新的任务而不阻塞当前的流程时,可以使用
fork
。这允许同时执行多个任务。例子:假设在一个用户登录的流程中,我需要并行地从多个源获取数据,比如用户信息、用户设置以及用户消息。我可以通过
fork
来分别启动三个不同的saga
,它们将并行执行,而不会互相等待。javascriptfunction* loginFlow() { // ... 登录逻辑 yield fork(fetchUserInfo); yield fork(fetchUserSettings); yield fork(fetchUserMessages); // ... 其他逻辑 }
-
非关键任务:如果有一些任务是次要的,或者说它的完成与否不会影响当前主流程的继续,可以使用
fork
来执行。例子:在提交表单数据后,我可能想要记录一些统计数据,但是不希望统计代码的失败影响主流程。
javascriptfunction* submitFormSaga(data) { try { yield call(api.submitForm, data); // 主要任务 yield put({ type: 'FORM_SUBMIT_SUCCESS' }); yield fork(recordFormSubmitStats, data); // 非关键任务 } catch (e) { yield put({ type: 'FORM_SUBMIT_FAILURE', message: e.message }); } }
-
长期运行的监听器:
fork
可用于启动一个任务,该任务将长期运行并监听将来可能发生的动作。它作为一个后台任务,在后台持续监听某些动作而不阻塞其他saga
。例子:一个聊天应用可能需要一个
saga
来监听接收新消息的动作。javascriptfunction* watchNewMessages() { while (true) { const action = yield take('RECEIVE_MESSAGE'); // 处理接收到的消息 } } function* mainSaga() { // ... yield fork(watchNewMessages); // ... }
在使用 fork
时,需要注意的是,fork
创建的任务是不会阻塞父 saga
的继续执行。如果你需要确保任务完成后再继续,应该使用 call
效果。此外,fork
创建的任务在出错时不会传播错误到父 saga
,这意味着如果不处理,可能会导致在后台默默地失败。因此,启动 fork
任务时通常需要在任务中进行适当的错误处理。