我正在使用Saga的takeLatest
来中止除最新请求以外的所有请求。效果很好,但现在我只想中止不具有相同网址,参数和方法的请求。
我知道Saga使用type
属性比较动作(就像香草Redux一样),但是我还向其中添加了url
,params
和method
我的行动,因为我希望有某种方法可以做类似的事情
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;
});
仅在所有这四个属性比较都为假时才中止请求。
我该怎么做?
答案 0 :(得分:0)
如果我从您的问题中得到的答案是正确的,则您需要这样做:
takeLatest()
。因此,我采用了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
}
})
我们有三种情况:
所以我添加了案例3的逻辑:
continue
处理下一个动作)。