我正在与React 16.8.2 一起工作。
我有一个简单的英雄观察者代码:
export default function* taskWatcher() {
yield all([
fork(subTaskWatcher1),
fork(subTaskWatcher2),
])
}
和subWatcher代码
function* subTaskWatcher2() {
const actionObj = yield take('ACTION');
const { history } = actionObj.payload;
let validated = false;
//... some Computation to validate navigation ... //
if (validated) yield call(history.push, '/pathname')
}
拦截操作并根据一些计算确定是否应在history
对象中推送新路径。
这仅在我第一次与触发上述代码的CTA互动时有效。由于传奇事件成为call
的阻塞呼叫,因此错过了所有其他互动。
这就是我的意思,如果我导航回到包含CTA的页面,
并且如果我再次单击它,则现在没有导航。
关于this github问题的讨论与我的关注有关。
我推荐了this个答案。真的和我的担心无关。
过去我遇到类似问题时,已经浏览了文档中的redux-saga non-blocking calls页。我不了解萨加斯及其影响是什么?
答案 0 :(得分:0)
根据@Jotakun建议使用takeEvery
,经过saga docs中的takeEvery pattern之后,以下解决方案似乎有效:
function* subTask2Worker(actionObj) {
const { history } = actionObj.payload;
let validated = false;
//... some Computation to validate navigation ... //
if (validated) yield call(history.push, '/pathname')
}
function* subTaskWatcher2() {
yield takeEvery('ACTION', subTask2Worker);
}
export default function* taskWatcher() {
yield all([
fork(subTaskWatcher1),
fork(subTaskWatcher2),
])
}