作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下情况:
export function* addCircle(circleApi, { payload }) {
try {
const response = yield apply(
circleApi,
circleApi.addCircle,
[payload]
);
if (response.error_type) {
yield put(addCircleFailedAction(response.error));
} else {
yield put(addCircleSucceededAction(response));
}
} catch (err) {
console.error(err);
}
}
export function* addTender(tenderApi, { payload }) {
try {
// NOTE: I want this to finish before continuing with rest of saga below.
yield call(addCircleAction(payload.circlePayload));
// Rest of saga removed for brevity.
} catch (err) {
console.error(err);
}
}
所以,基本上 addCircle
正在进行 API 调用,并且根据其成功,我调用适当的 redux 操作。现在,在另一个传奇中,我调用负责 addCircle
传奇的操作,并且我希望它在继续传奇的其余部分之前完成执行。我尝试使用 call,但它基本上不会等待 addCircle 传奇完成执行。有什么办法可以等待吗?我从组件内部调用 addCircle ,我不需要等待它,但在这个特定的实例中,我必须在传奇中调用它,所以我真的需要等待它完成执行后,更改应用程序的状态,以便我可以在 addTender
saga 的其余部分使用更新后的状态。有什么想法吗?
最佳答案
根据您的代码片段,您的 addCircle
传奇将在执行完成之前分派(dispatch) addCircleFailedAction
或 addCircleSucceededAction
操作创建者。因此,我们必须等待 addTender
传奇中的这些操作。
基本上,这就是你应该做的。我只是根据操作创建者名称猜测您的操作类型。
yield call(addCircleAction(payload.circlePayload));
yield take([ADD_CIRCLE_FAILED_ACTION, ADD_CIRCLE_SUCCEEDED_ACTION]);
// Rest of the saga
不过有一种极端情况。您没有在 addCircle
传奇的 catch
block 中调度任何操作。也许您可以在 catch
block 内调度一个名为 addCircleExceptionAction
的操作,并与其他操作一起等待它,如下所示:
yield take([ADD_CIRCLE_FAILED_ACTION, ADD_CIRCLE_SUCCEEDED_ACTION, ADD_CIRCLE_EXCEPTION_ACTION]);
关于reactjs - 如何在 redux-saga 中等待 saga 的执行完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52787312/
我是一名优秀的程序员,十分优秀!