如何使takeLatest考虑url,参数和方法?

时间:2018-12-11 20:13:14

标签: redux redux-saga

我正在使用Saga的takeLatest来中止除最新请求以外的所有请求。效果很好,但现在我只想中止具有相同网址,参数和方法的请求。

我知道Saga使用type属性比较动作(就像香草Redux一样),但是我还向其中添加了urlparamsmethod我的行动,因为我希望有某种方法可以做类似的事情

yield takeLatestIf((action, latestAction) => {
    const sameType = action.type === latestAction.type;
    const sameUrl = action.url === latestAction.type;
    const sameParams = areEqual(action.params, lastAction.params);
    const sameMethod = action.method === lastAction.method;

    return sameType && sameUrl && sameParams && sameMethod;
});

仅在所有这四个属性比较都为假时才中止请求。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

如果我从您的问题中得到的答案是正确的,则您需要这样做:

  1. 类似于标准takeLatest()
  2. 但是当提出重复请求时,请忽略该请求并等待已经执行的请求(合理的用例)。

因此,我采用了takeLatest()实现provided in the docs,并将其调整为适合您的方案:

const takeLatestDeduped = (patternOrChannel, compareActions, saga, ...args) => fork(function*() {
  let lastTask
  let lastAction
  while (true) {
    const action = yield take(patternOrChannel)
    // New logic: ignore duplicate request
    if (lastTask && lastTask.isRunning() && !compareActions(lastAction, action)) {
      continue
    }
    if (lastTask) {
      yield cancel(lastTask)
    }
    lastTask = yield fork(saga, ...args.concat(action))
    // New logic: save last action
    lastAction = action
  }
})

我们有三种情况:

  1. 没有正在运行的任务:启动新任务-标准行为
  2. 正在运行的任务,没有重复项:取消旧任务,开始新任务-标准行为
  3. 正在运行的任务,重复了:忽略-新的自定义行为

所以我添加了案例3的逻辑:

  1. 忽略重复的请求(在这种情况下,什么也不做,因此我continue处理下一个动作)。
  2. 保存上一个动作以备将来重复检查。