メインコンテンツへ移動

並行性

基本セクションでは、エフェクト間の並行性を管理するためにヘルパエフェクトtakeEverytakeLatest を使用する方法について説明しました。

このセクションでは、低レベルのエフェクトを使用してこれらのヘルパをどのように実装できるかについて説明します。

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 要求を処理する場合に役立つことがあります。