我如何处理在redux传奇中调用不同函数的多个动作?

时间:2018-05-07 21:17:53

标签: javascript redux generator yield redux-saga

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



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

希望我已经足够清楚了:))

1 个答案:

答案 0 :(得分:0)

如此修改传奇d如何:

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

一旦d被发送,这将导致传奇中的takeEvery LOGIN_SUCCESS

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