这是一个更容易理解的例子。
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
希望我已经足够清楚了:))
答案 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
。