Redux Saga等待动作创建者进行api调用

时间:2020-09-25 15:24:06

标签: javascript redux-saga

我有一个动作创建者,正在这样观看:

yield takeLatest('actionCreator', actionFlow);

在文件X中。

在内部操作流程中,有一个api调用和另一个将数据存储到商店的调度。

然后,从文件Y开始,我有了一个传奇,我想称其为actionCreator。 所以我去:

yield put({ type: 'actionCreator', etc.. });

但是,在此之后,我会执行yield select(selector),其中选择器选择了该数据,并返回null(与api调用之前一样)。

有没有办法等待“ actionFlow”结束?

文件X:

export const aCreator= ({ data, type }) => ({
    type: ACTION_A,
    payload: { data, type },
}); 


function* aFlow() {
   //api call
   //put
}

export default function*() {
    yield takeLatest(ACTION_A, aFlow);
}

文件Y

import { aCreator } from 'fileX';

function* bFlow(){
    yield put(aCreator({ data }));

    const something = yield select(selector); //this should return the data saved in the reducer by aFlow but return null, as if it didn't wait for aFlow to finish.
}

export default function*() {
    yield takeLatest(ACTION_B, bFlow);
}

1 个答案:

答案 0 :(得分:0)

put处于非阻塞状态,因此不会等到aFlow完成。

function* bFlow() {
   yield put(aCreator({ data }));

   const something = yield select(selector); // this will happen immediately
}

您可以在take之前添加一个select效果,这样它将等待来自aFlow的呼叫结束。

function* bFlow() {
   yield put(aCreator({ data }));
   yield take(dispatched action from aFlow after api call);

   const something = yield select(selector); // will wait until aFlow finishes
}

分派的动作实际上可以是任何东西:

function* aFlow() {
   //api call
   //put
   yield put('api_finished');
}

function* bFlow() {
   yield put(aCreator({ data }));
   yield take('api_finished');

   const something = yield select(selector); // will wait until aFlow finishes
}
相关问题