【发布时间】:2018-10-30 19:30:31
【问题描述】:
我有一个像这样的传奇(一些伪代码)。
Saga1 调用一个 API。根据结果,我需要调用另外两个 API。如果所有 API 都成功,我调用 onSuccess,否则调用 onFailure。
代码似乎几乎可以正常工作,但并不完全正常。 yield all 面临的问题是,一旦调用了第一个 yield put,它就认为 saga2 和 saga3 完成了(参见 saga2/3 中的评论)。它没有等待获取收益完成。
我认为部分原因是我误解了“完全效果”的含义。但除此之外,我希望让所有东西都等到一切都完成。我希望 saga2/3 中的 fetch 抛出的任何异常都能被 saga1 中的 catch 捕获。
saga1(action) {
const { onSuccess, onFailure } = action.payload;
try {
yield fetch...
if(response.some_condition) yield all([
put(saga2()),
put(saga3())
])
onSuccess();
}
catch(e) {
onFailure();
}
}
saga2(action) {
yield put(someaction()) // This yields
yield fetch...
}
saga3(action) {
yield put(someaction()) // This yield
yield fetch...
}
下面的这段代码与我下面关于 catch not working 的评论有关
action1 () { // action2 is same
try {
yield fetch();
yield put(FINISHED_1);
}
catch(e) {
throw (e);
}
}
saga1() {
try {
yield put(action1());
yield put(action2());
yield all([
take(FINISHED_1),
take(FINISHED_2),
])
console.log("this doesn't print if exception in either action");
}
catch(e) {
console.log("this doesn't print if exception in either action");
}
finally {
console.log("this prints fine");
}
}
【问题讨论】:
-
您的示例代码似乎有点不对劲。您将 saga 传递给
put,这是不正确的。您可以将操作传递给put,例如put({ type: 'ACTION_2' }),然后saga2通过takeEvery('ACTION_2', saga2)侦听该操作。或者您可以将 saga 传递给call,例如call(saga2, arg1, arg2)。 -
@bsapaka 为了简单起见,我只是简化了代码。我实际上是在调用 put({type:ACTION2}) put({type:ACTION3}),而后者又调用了 saga2 或 3。
-
您可以使用
yield take(ACTION_3_FINISHED)等待ACTION_3_FINISHED被调度
标签: reactjs redux redux-saga