并发
在基础部分,我们看到了如何使用辅助效果 takeEvery
和 takeLatest
来管理 Effect 之间的并发。
在本节中,我们将了解如何使用低级 Effect 来实现这些辅助程序。
takeEvery
import {fork, take} from "redux-saga/effects"
const takeEvery = (pattern, saga, ...args) => fork(function*() {
while (true) {
const action = yield take(pattern)
yield fork(saga, ...args.concat(action))
}
})
takeEvery
允许同时启动多个 saga
任务。
takeLatest
import {cancel, fork, take} from "redux-saga/effects"
const takeLatest = (pattern, saga, ...args) => fork(function*() {
let lastTask
while (true) {
const action = yield take(pattern)
if (lastTask) {
yield cancel(lastTask) // cancel is no-op if the task has already terminated
}
lastTask = yield fork(saga, ...args.concat(action))
}
})
takeLatest
不允许多个 Saga 任务同时执行。只要它收到一个新的调度操作,它就会取消任何之前分叉的任务(如果仍在运行)。
takeLatest
可用于处理 AJAX 请求,我们只希望获得最新请求的响应。