Для этого вам понадобится отдельный сигнальный механизм. Я бы использовал channel
для этого.
a
сначала создает канал
a
порождает dScheduler
прохождение канала
a
передает канал в качестве аргумента b
b
делает put
к каналу в конце
a
делает put
на канал в конце (когда заканчивается c
)
dScheduler
делает два take
с на канале, а затем вызывает d
Код будет выглядеть примерно так:
import { delay, channel } from "redux-saga";
import { spawn, call, put, take } from "redux-saga/effects";
const randomDelay = () => parseInt(Math.random() * 500);
const B_OR_C_COMPLETED = "B_OR_C_COMPLETED";
export const a = function*() {
const bcCompletedChannel = channel();
yield spawn(dScheduler, bcCompletedChannel);
yield spawn(b, bcCompletedChannel);
yield call(c);
yield put(bcCompletedChannel, B_OR_C_COMPLETED);
};
const b = function*(bcCompletedChannel) {
yield delay(randomDelay());
yield put(bcCompletedChannel, B_OR_C_COMPLETED);
};
const c = function*() {
yield delay(randomDelay());
};
const dScheduler = function*(bcCompletedChannel) {
yield take(bcCompletedChannel);
yield take(bcCompletedChannel);
yield call(d);
};
const d = function*() {
};
Вот CodeSandbox с добавленными журналами консоли и увеличенной задержкой, чтобы упростить проверку поведения:
Соответствующая часть документации Redux Saga здесь . В частности, раздел внизу называется «Использование каналов для связи между сагами».