如何使用相同的操作调用取消或更新Saga轮询请求

时间:2018-09-19 13:35:38

标签: reactjs redux-saga saga

我正在使用竞争条件以延迟和取消方式轮询api。

我想实现的是在页面呈现时,我想开始轮询得分,并且在某些操作下,我将使用其他一些查询参数调用相同的轮询(相同的api),以便我只想更新相同的轮询新的参数。

为此,我做了这样的事情。

export function* pollScoreSnippets() {
  while (true) {
    try {
      const { data } = yield call(() => request(apis.GET_SCORE_API));
      yield put({
        type: types.DASHBOARD_DATA_FETCHED,
        payload: {
          type: ['scores'],
          data: {
            scores: { values: data.data },
          },
        },
      });
      yield call(delay, SCORE_SNIPPET_POLLING_DELAY);
    } catch (err) {
      yield put({
        type: types.DASHBOARD_DATA_FETCHING_ERROR,
        payload: {
          error: err.response.data,
        },
      });
      yield call(delay, SCORE_SNIPPET_POLLING_DELAY + 10);
    }
  }
}

export function* watchPollSaga() {
  while (true) {
    // console.log('watching');
    yield take(types.POLL_SCORE_SNIPPETS);
    yield race([call(dashGenerators.pollScoreSnippets), take(types.STOP_POLLING_SCORE_SNIPPETS)]);
  }
}

这对我有用,但是使用这种方法,我必须调用取消动作,然后再次调用相同的动作来重新启动轮询。

有什么方法可以让我调用相同的操作,它会更新当前的轮询请求还是取消或重新启动新的轮询请求

某种东西:

export function* watchPollSaga() {
  while (true) {
    // console.log('watching');
    yield take(types.POLL_SCORE_SNIPPETS);
    yield race([call(dashGenerators.pollScoreSnippets), take(types.POLL_SCORE_SNIPPETS)]);
  }
}

0 个答案:

没有答案