Как рекурсивно вызывать Redux Saga Watcher - PullRequest
0 голосов
/ 12 января 2019

Я изо всех сил пытаюсь вызвать рекурсивный наблюдатель redux-saga, который будет работать так же, как и функция setInterval, в которой функция наблюдателя должна вызываться через каждые n секунд, и мы могли бы очистить интервал, как clearInterval.

Мои требования -

Вызов рекурсивного наблюдателя за реду через каждые n секунд. Здесь n хранится в магазине и может быть обновлено. Поэтому, когда n будет обновлено в хранилище, нам нужно остановить старую функцию наблюдателя (например, clearInterval) и повторно запустить старый рекурсивный наблюдатель с обновленными n секундами.

Ответы [ 2 ]

0 голосов
/ 19 января 2019
import { delay } from "redux-saga";
import {
  all,
  take,
  select,
  cancel,
  put,
  takeEvery,
  fork,
} from "redux-saga/effects";

export function* loop() {

  // Get the store
  const state = yield select();
  let n = state.n;

  // Will keep looping with a delay of n milliseconds,
  // where n is accessed from the store.
  while (true) {
    yield delay(n);
    yield put({ type: "CALLED_AGAIN" });
  }
}

export function* startProcess() {

  // Start the loop
  let task = yield fork(loop);
  let action = yield take(["END_PROCESS", "INC_TIMER"]);

  switch (action.type) {
    case "END_PROCESS":

      // For stopping the loop
      yield cancel(task);
      break;
    case "INC_TIMER":

      // While changing the duration of the timer:
      // 1) End the previous loop
      yield cancel(task);

      // 2) Change the timer(stored as n here)
      yield put({ type: "INC_TIMER_COMPLETED" });

      // 3) Start the recursive calls again
      yield put({ type: "START_PROCESS" });
      break;
    default:
      break;
  }
}

export function* watchStartTasks() {
  // Initially "START_PROCESS" is dispatched to start the recursive calls.
  yield takeEvery("START_PROCESS", startProcess);
}

export default function* rootSaga() {
  yield all([watchStartTasks()]);
}
0 голосов
/ 12 января 2019

Ответ будет меняться в зависимости от некоторых критериев - например, хотите ли вы ждать N мс после изменения N или, если снимите флажок, хотите отменить работника - но это может дать вам приблизительное представление:

function * rootSaga() {
    let prevTask
    yield takeEvery(CHANGE_N, function*() {
        if (prevTask) prevTask.cancel();
        const n = yield select(getN);
        task = yield throttle(n, FOO, fooSaga);
    });
}

Если throttle недостаточно, вы можете заменить его на пользовательский наблюдатель, используя delay и fork.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...