[我试图用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
。 (先前的操作已排队进入该通道)。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仅执行一次操作?
我可能会误解您要做什么,但是对我来说,问题似乎是takeEvery
和actionChannel+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);
}
}