Вы могли бы:
- "внедряет" самостоятельно то, что делает
takeLatest
.
Документы говорят
Появляется сага о каждом действии, отправляемом в Магазин, которое соответствует шаблону. И автоматически отменяет все предыдущие саги, запущенные ранее, если они все еще выполняются.
Таким образом, вместо записи yield takeLatest(CheckLocalAuthActionType.REQUEST_SEND, handleCheckAuthFetch);
вы можете написать функцию, которая делает то же самое
export default function* forkHandleCheckAuthFetch() {
let task;
while (true) {
// this loop stops here until one of the actions is triggered
const action = yield take([CheckLocalAuthActionType.REQUEST_SEND, LoginActionType.REQUEST_SEND]);
// both the actions cancel the previous forked task (similar to what `takeLatest does`)
if (task) {
cancel(task);
}
// only the "correct" action starts the desided behaviour
if (action.type === CheckLocalAuthActionType.REQUEST_SEND) {
// a fork can be cancelled...
task = yield fork(handleCheckAuthFetch, action);
}
}
}
(функция takeLatest
spawn
- сага, в то время как моя реализация fork
- сага, но пока не беспокойтесь об этом)
- то же самое, что мы можем сделать для
handleLogoutFetch
export default function* forkHandleLogoutFetch() {
let task;
while (true) {
const action = yield take([LogoutActionType.REQUEST_SEND, LoginActionType.REQUEST_SEND]);
if (task) {
cancel(task);
}
if (action.type === CheckLocalAuthActionType.REQUEST_SEND) {
task = yield fork(handleLogoutFetch, action);
}
}
}
- и затем измените
userSaga
на
export default function* userSaga() {
yield forkHandleCheckAuthFetch();
yield forkHandleLogoutFetch();
yield takeLatest(LoginActionType.REQUEST_SEND, handleLoginFetch);
}
Итак, теперь:
- ваше
CheckLocalAuthActionType.REQUEST_SEND
действие вызывает handleCheckAuthFetch
, как это было до моей реализации
- ваше
LogoutActionType.REQUEST_SEND
действие вызывает handleLogoutFetch
, как это было до моей реализации
- действие
LoginActionType.REQUEST_SEND
отменяет каждый запуск handleCheckAuthFetch
и handleLogoutFetch
sagas
Это то, что я делаю в своих проектах, вы должны абстрагировать их от служебной функции, мне важно, чтобы вы поняли, как она работает и как ее реализовать ?