【问题标题】:How I deal with multiple actions calling different functions in redux saga?我如何处理在 redux saga 中调用不同函数的多个动作?
【发布时间】:2018-10-17 18:04:54
【问题描述】:

这是一个更容易理解的例子。

function* a() {
 yield takeEvery(action.LOGIN_SUCCESS, b)
}

function* b() {
  yield takeEvery(action.FETCH_SUCCESS, c)
}

function* c() {
  yield console.log('action from function a')

}

function* d() {
yield takeEvery(action.FETCH_SUCCESS, e)

}

function* e() {
  yield console.log('action from function d')
}



yield all([
  fork(a),
  fork(d),
])

如果 LOGIN_SUCCESS 发生,则函数 b 开始等待 FETCH_SUCCESS。 同时,函数 d 正在等待 FETCH_SUCCESS。

问题是:如何在函数 a 中的 takeEvery 执行 LOGIN_SUCCESS 然后 FETCH_SUCCESS 操作后停止函数 d 运行?

在这种情况下,我只想调用函数 c。相反,函数 c 和函数 e 都被调用,因为 FETCH_SUCCESS 发生了。

我的想法是我想在 redux saga 中有一些东西,它可以记住前一个生成器采取的先前操作,以便我可以区分两种不同的路径:

1) LOGIN_SUCCESS -> FETCH_SUCCESS -> function c

2) FETCH_SUCCESS -> function e

希望我已经足够清楚:)

【问题讨论】:

    标签: javascript redux generator yield redux-saga


    【解决方案1】:

    像这样修改 saga d 怎么样:

    function* d() {
      const task = yield takeEvery(action.FETCH_SUCCESS, e)
      yield take(action.LOGIN_SUCCESS)
      yield cancel(task)
    }
    

    一旦LOGIN_SUCCESS 被调度,这将杀死传奇d 中的takeEvery。

    由于您将takeEvery 用于LOGIN_SUCCESS,因此我认为这可能会发生多次。在这种情况下,您可能希望在注销时运行另一个传奇d

    【讨论】:

    • 使用这个解决方案,你不会涵盖这种情况:如果 LOGIN_SUCCESS 发生,函数 b 被调用,那么当 FETCH_SUCCESS 发生时,函数 c 和 e 都被再次调用,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2017-09-12
    • 2017-10-14
    • 2020-05-08
    • 1970-01-01
    • 2019-09-14
    • 2021-06-18
    相关资源
    最近更新 更多