Redux-saga,产生呼叫(history.push,“路径名”),仅在第一时间有效,阻止所有其他呼叫

时间:2019-03-16 07:56:42

标签: javascript reactjs redux generator redux-saga

我正在与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页。我不了解萨加斯及其影响是什么?

1 个答案:

答案 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),
  ])
}