Я только что попал в redux-saga и немного запутался в наблюдателях и генераторах
Возьмем, например, этот код ниже, это точка входа в мой файл саг.
function* employeesSaga() {
yield all([
takeEvery(getType(employeeActions.login.request), handleLoginRequest),
takeEvery(getType(employeeActions.verifyLogin.request), handleVerifyLoginRequest),
takeEvery(getType(employeeActions.logout), handleLogout)
]);
}
Я напрямую подключаю каждый вызов redux к соответствующему обработчику.
Но некоторые люди используют наблюдатели, а затем вызывают обработчик в этом генераторе. Какова цель этого? Должен ли я использовать этот шаблон?
Кроме того, я заметил, что некоторые люди оборачивают весь свой обработчик while(true), это необходимо? Потому что мой код отлично работает и без этого ...





По первому вопросу
Возможно, это просто вопрос удобочитаемости.
Наблюдатели не являются настоящим «шаблоном», они просто делают ваш код более ясным в отношении его намерений:
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 = yield take(getType(employeeActions.login.request))
yield call(handleLoginRequest, action)
}
}
Разница:
Поток в то время как (правда) -вызов не позволяет одновременно выполнять два экземпляра одного обработчика. Выполняется одно действие, затем вызов блокируется, пока 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 также предоставляют его внутреннюю реализацию.
Я думаю, что в то время как (правда) -вызов - лучший способ входа в систему. Вероятно, вам не нужны одновременные входы в систему. Если вы блокируете одновременные входы в систему на уровне пользовательского интерфейса, эти потоки эквивалентны, но в то время как (правда) -вызов является наиболее явным и читаемым.