Ожидание в редукс-саге

Я хочу ввести задержку в саге (используя 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, решит вашу проблему в одну строку.

Другие вопросы по тегам