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 任务时通常需要在任务中进行适当的错误处理。