gpt4 book ai didi

reactjs - 如何在 redux-saga 中等待 saga 的执行完成?

转载 作者:行者123 更新时间:2023-12-03 13:31:22 32 4
gpt4 key购买 nike

我有以下情况:

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) addCircleFailedActionaddCircleSucceededAction 操作创建者。因此,我们必须等待 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com