Ожидание в редукс-саге
Я хочу ввести задержку в саге (используя redux-saga).
Как я могу это сделать?
Если redux-saga предоставляет API, мне также будет интересно, как это сделать вручную.
function* save({ payload }) {
yield put(pending());
// I want to simply wait (non-blocking) here for say 2 seconds
yield put(complete());
}
4 ответа
Решение
Redux-sagas имеет специальный эффект для этого:
задержка (мс, [val])
Возвращает Promise, который разрешается через миллисекунды с помощью val.
Пример:
import { delay } from 'redux-saga'
import { call } from 'redux-saga/effects'
function* someSaga(input) {
yield put(someAction())
yield call(delay, 500)
yield put(anotherAction())
}
Вы могли бы достичь этого с обещанием:
function sleep(sec) {
return new Promise(resolve => setTimeout(resolve, sec*1000));
}
function* save({ payload }) {
yield put(pending());
yield sleep(2); //wait 2 seconds
yield put(complete());
}
export function delay(ms, val = true) {
let timeoutId
const promise = new Promise(resolve => {
timeoutId = setTimeout(() => resolve(val), ms)
})
promise[CANCEL] = () => clearTimeout(timeoutId)
return promise
}
Использование задержки, импортированной из redux-saga/effects, решит вашу проблему в одну строку.