По первому вопросу
Это может быть просто вопрос читабельности.
Наблюдатели не являются настоящим "шаблоном", они просто делают ваш код болееясно о его намерениях:
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 является наиболее явным и читаемым.