我试图用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仅执行一次操作?
答案 0 :(得分:0)
我可能会误解您要做什么,但是对我来说,问题似乎是takeEvery
和actionChannel+take
的组合,因为它们都在等待相同的操作类型。 / p>
我认为您应该只使用给定类型的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);
}
}