我有一个动作创建者,正在这样观看:
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);
}
答案 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
}