Я опрашиваю два API одновременно, используя redux-saga, и я хочу контролировать оба опроса с помощью race
с помощью действия, которое может остановить оба из них:
function* root() {
yield all([
call(startSimulation),
takeEvery(RESTART_SIMULATION, stopAndStartSimulation),
takeEvery(STOP_SIMULATION, haltSimulation),
])
export function* startPolling(vin: string) {
yield all([call(pollEventsSagaWorker), call(pollStatusSagaWorker, vin)])
}
export function* initiateSimulation() {
const vin = yield select(vinSelector)
yield call(startPolling, vin)
}
export function* haltSimulation() {
const runningSimulation = yield select(simulationsDataSelector)
if (runningSimulation) {
yield put(deleteSimulation(runningSimulation.id))
}
}
export function* startSimulation() {
while (true) {
yield take(INIT_SIMULATION)
yield race([call(initiateSimulation), take(STOP_SIMULATION)])
}
}
export function* stopAndStartSimulation() {
yield put(stopSimulation())
// do some other stuff
}
stopSimulation()
- создатель действия (с типом STOP_SIMULATION
).
Вот пример к саге опроса:
export function* pollEventsSagaWorker() {
while (true) {
try {
yield put(fetchEvents())
yield delay(EVENT_POLL_INTERVAL)
} catch (err) {
console.error('polling failed', err)
}
}
}
Проблема в том, что когда я звоню STOP_SIMULATION
, происходит несколько секунд, пока все идет дальше (в то время как пользовательский интерфейс также застрял) - чтоможет быть причиной?