bai3/note

高级-并发

Opened this issue · 0 comments

bai3 commented

并发

如何使用辅助函数takeEvery和takeLatest effect来管理Effects之间的并发

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 任务并行被fork执行

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为空操
        }
        lastTask = yield fork(saga, ...args.concat(action))
    }
})

takeLatest不允许多个saga任务并行执行。一旦接收到新的发起的action,它就会取消前面所有fork过的任务(如果这些任务还在执行的话)

在处理AJAX请求的时候,如果我们只希望获取最后那个请求的响应,takeLatest就会非常有用。