【问题标题】:Saga not running when action creator being called inside componentDidMount当在 componentDidMount 中调用动作创建者时,Saga 没有运行
【发布时间】:2018-04-15 08:16:56
【问题描述】:

我创建了一个 saga,它监听“GET_CHARACTER”类型的动作,然后它会点击 api 并将数据发送到 reducer。

我尝试在 componentDidMount 中调用动作创建者,动作发生了(我可以在开发工具中看到它)但没有调用 saga。

传奇确实有效,因为我尝试通过在单击按钮时调用它来测试动作创建者,传奇运行并且我得到了我的数据。

当我尝试在 componentDidMount 中调用动作创建者时它不起作用。

这是否与 Saga 作为中间件有关?

【问题讨论】:

  • 在哪里分派你的行动并不重要。您的代码中可能存在错误。请提供相关代码sn-ps。
  • 我也遇到了同样的问题...在此期间您找到解决方案了吗?
  • ...我在我的情况下解决了它,添加了一个答案以防它也适用于其他人遇到的问题,因为在搜索问题时这在谷歌上排名很高

标签: reactjs redux react-redux redux-saga


【解决方案1】:

我遇到了类似的问题,就我而言,这是由于在我的根传奇之前设置了侦听componentDidMount 中触发的操作的代码设置了一个阻塞yield call(...other thing),所以它以这样的顺序执行:(1)在root saga中,其他事情开始运行(2)在componentDidMount中应该触发我的其他saga的动作被调度(3)只有在其他事情完成后,剩下的根 saga 的运行,并为应该由来自 componentDidMount 的操作触发的操作注册了侦听器,但此时为时已晚,sagas 不会启动在注册运行之前触发的操作行动。

希望这是有道理的......

以下是相关代码:

componentDidMount() {
  this.props.doStuffThatTriggerMySaga();
}

...然后在 sagas 中:

function* mySaga(action) {
  // ...
}

function* rootSaga() {
  yield call(doOtherStuff); // this was the problem
  // ...
  yield takeEvery(ACTION_TRIGGERING_MY_SAGA, mySaga)
}

解决方案是重构代码以消除“阻塞”yield call(doOtherStuff); 调用,并使其他内容也由操作触发运行,例如有一个yield takeEvely(OTHER_STUFF_ACTION, doOtherStuff); 并找出对您有意义的地方触发该操作。

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 2020-10-31
    • 2018-08-11
    • 2020-01-04
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多