Как буферизировать действия с помощью redux-саги - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно увеличить переменную count при каждом вызове действия в саге и через некоторое время, например, 1500 мс, вызвать func и clear count.Как мне это сделать?

Что-то в этом роде:

export function* example() {
  let count = 0;
  let timeout;

  const data = yield take(rootAction.adverts.likeAdvert.request)

  if (timeout) {
    clearTimeout(timeout)
  }

  count++;

  timeout = setTimeout(() => {
    // replace with eventChanel
    yield apiCall(count, data)

    count = 0
  }, 1500)
}

1 Ответ

0 голосов
/ 26 июня 2019

Вместо использования тайм-аута Javascript, это может быть решено очень аккуратно с помощью мощной функциональности самой redux-saga, в частности комбинации takeLatest с побочным эффектом delay.

Пример:

export function* example() {
    const data = yield take(rootAction.adverts.likeAdvert.request);
    const count = yield select((state) => state.count);
    yield put({ type: COUNT_UPDATE, count: count + 1, data });
}

export function* listenForCount() {
    yield takeLatest(COUNT_UPDATE, function* handle(action) {
        yield delay(1500);
        yield put(COUNT_RESET);
        yield apiCall(action.count, action.data);
    });
}

С таким редуктором:

export function count(state = 0, action) {
    switch (action.type) {
        case COUNT_UPDATE:
            return action.count;
        case COUNT_RESET:
            return 0;
        default:
            return state;
    }
}
...