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

5 reactjs redux redux-saga react-redux

我有以下情况:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,基本上addCircle是在进行API调用,并根据其成功调用适当的redux操作。现在,在另一个传奇中,我将负责addCircle传奇的动作称为“动作” ,我希望它在继续执行其余传奇之前完成执行。我尝试使用call,但它基本上不等待addCircle传奇完成执行。有什么方法可以等待吗?我addCircle从组件内部调用,不需要等待,但是在这种特定情况下,我必须在传奇中调用它,因此我真的需要等待它完成执行,更改应用程序的状态,以便我可以在其余的addTender传奇中使用更新后的状态。有任何想法吗?

vah*_*san 6

根据您的代码片段,您的addCirclesaga 将在完成执行之前分派addCircleFailedActionaddCircleSucceededAction动作创建者。所以我们将不得不等待你的addTender传奇中的那些行动。

基本上,这就是你应该做的。我只是根据动作创建者的名字猜测你的动作类型。

yield call(addCircleAction(payload.circlePayload));
yield take([ADD_CIRCLE_FAILED_ACTION, ADD_CIRCLE_SUCCEEDED_ACTION]);

// Rest of the saga
Run Code Online (Sandbox Code Playgroud)

但是有一种边缘情况。你没有在catch你的addCircle传奇区块中发送任何动作。也许你可以调度一个名为addCircleExceptionActioninside catchblock的动作并等待它以及其他动作,如下所示:

yield take([ADD_CIRCLE_FAILED_ACTION, ADD_CIRCLE_SUCCEEDED_ACTION, ADD_CIRCLE_EXCEPTION_ACTION]);
Run Code Online (Sandbox Code Playgroud)