redux-saga中的操作通道调用重复操作

问题描述 投票:0回答:1

[我试图用actionChannel顺序运行多个请求,问题是当我希望仅检索一次该动作及其有效载荷时,该动作及其有效载荷将被检索多次(take)。这是一个可重现的示例:

function* requestSequentially(action) {
  console.log('action', action); // contains type and payload
  const chan = yield actionChannel(action.type)
  let index = 0;
  while (true) {
    const ac = yield take(chan)
    yield index += 1
    console.log('channel', ac, index);
  }
}

其行为如下

  • 在第一次分派此操作时,仅记录action: ...,这是调用actionChannel之前的日志,从不从通道检索该操作。
  • 下一个电话,输出channel, <action> 1。 (先前的操作已排队进入该通道)。
  • 在随后的呼叫中,它从通道开始并记录所有先前的请求,如下所示:(假设当前呼叫为#3)
channel <action> 3
channel <action> 2
channel <action> 1

如果是第4次通话,那么您可以想象它从4开始然后下降到1。

编辑:Saga导出为rootSaga的方式是:takeEvery(SAVE_SEQUENTIALLY, requestSequentially), ...

和动作:export const action = payload => ({ type: SAVE_SEQUENTIALLY, payload })

我如何使actionChannel仅执行一次操作?

reactjs redux redux-saga
1个回答
0
投票

我可能会误解您要做什么,但是对我来说,问题似乎是takeEveryactionChannel+take的组合,因为它们都在等待相同的操作类型。

我认为您应该只使用给定类型的requestSequentially传奇而不是takeEvery:

yield fork(requestSequentially, SAVE_SEQUENTIALLY)

然后将给定类型用于actionChannel:

function* requestSequentially(type) {
  const chan = yield actionChannel(type)
  let index = 0;
  while (true) {
    const ac = yield take(chan)
    yield index += 1
    console.log('channel', ac, index);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.