Какой смысл наблюдателям в редукс-саге? - PullRequest
0 голосов
/ 16 ноября 2018

Я только что увлекся редукс-сагой, и я немного запутался в наблюдателях и генераторах

Возьмем, к примеру, приведенный ниже код, который является точкой входа в мой файл sagas

function* employeesSaga() {
    yield all([
        takeEvery(getType(employeeActions.login.request), handleLoginRequest),
        takeEvery(getType(employeeActions.verifyLogin.request), handleVerifyLoginRequest),
        takeEvery(getType(employeeActions.logout), handleLogout)
    ]);
}

Я напрямую соединяю каждый редукционный вызов с соответствующим обработчиком.

Но некоторые люди используют наблюдателей, а затем они вызывают обработчик в этом генераторе. Какова цель сделать это? Должен ли я использовать этот шаблон?

Кроме того, я заметил, что некоторые люди оборачивают весь свой обработчик while(true), это необходимо? Потому что и мой код прекрасно работает без этого ...

1 Ответ

0 голосов
/ 16 ноября 2018

По первому вопросу

Это может быть просто вопрос читабельности.

Наблюдатели не являются настоящим "шаблоном", они просто делают ваш код болееясно о его намерениях:

function* watchLoginRequest() {
    yield takeEvery(getType(employeeActions.login.request), handleLoginRequest)
}

function* watchVerifyLoginRequest() {
    yield takeEvery(getType(employeeActions.verifyLogin.request), handleVerifyLoginRequest)
}

function* watchLogout() {
    yield takeEvery(getType(employeeActions.logout), handleLogout)
}

function* startWatchers() {
    yield call(watchLoginRequest)
    yield call(watchVerifyLoginRequest)
    yield call(watchLogout)
}

function* employeesSaga() {
    yield call(startWatchers)
}

Второй вопрос

Возможно, вы говорите об этом виде потока:

function* watchLoginRequest() {
    while (true) {
        const action = take(getType(employeeActions.login.request))
        yield call(handleLoginRequest, action)
    }
}

Разница:

  • Поток while (true) -take-call не позволяет выполнять два экземпляра одного обработчика одновременно.Требуется одно действие, затем блокируется вызов, пока не закончится handleLoginRequest().Если пользователь нажимает кнопку входа в систему до завершения обработки, соответствующие действия пропускаются.

  • Поток takeEvery () разрешает одновременное выполнение обработчика.Это может быть не то, что вы хотите.

Документы Redux-saga сообщают , как takeEvery() реализовано под капотом:

const takeEvery = (patternOrChannel, saga, ...args) => fork(function*() {
  while (true) {
    const action = yield take(patternOrChannel)
    yield fork(saga, ...args.concat(action))
  }
})

Вы видите, takeEvery() неблокирует себя (разветвление) и выполняет обработчик неблокирующим способом (разветвление).

Третий вариант

Существует также takeLatest(), который разрешает одновременное выполнение обработчика, но если есть предыдущий экземпляр выполняющегося обработчика, он отменяет его.Redux-saga docs также предоставляет свою внутреннюю реализацию.

, хотя (true) -take-call является лучшим в качестве потока входа в систему, я думаю.Вы, вероятно, не хотите одновременных входов в систему.Если вы блокируете параллельные входы в систему на уровне пользовательского интерфейса, эти потоки эквивалентны, но , тогда как (true) -take-call является наиболее явным и читаемым.

...