В общем, fork
полезно, когда в саге нужно запустить неблокирующую задачу. Неблокирование здесь означает: вызывающий объект запускает задачу и продолжает выполнение, не дожидаясь ее завершения.
Это может быть полезно во множестве ситуаций, но есть 2 основные из них:
- группировка саг по логическому домену
- сохранение ссылки на задачу, чтобы иметь возможность отменить / присоединиться к ней
Ваша сага верхнего уровня может быть примером первого варианта использования. Скорее всего, у вас будет что-то вроде:
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
. Кроме того, он может хранить ссылку на него, чтобы при необходимости отменить его.
Для полноты картины есть еще один способ начать неблокирующие вызовы: spawn
. fork
и spawn
отличаются тем, как ошибки и отмены перемещаются от дочерней к родительской саге.
person
VonD
schedule
22.03.2017