首先,这个强大的图书馆有很多道具!我仍然在用例中挣扎。我想先调用另一个史诗,等到完成后再继续当前史诗。假设我有一个用户可以更改内容的表单。在将其他数据加载到表单之前,我想先保存当前更改。有什么想法吗?
听起来像是您想要的:如果一部史诗想要开始另一部史诗作品,并等待其完成再继续。
一种方法是(使用伪名称),当您收到初始操作时,LOAD_OTHER_DATA您会立即开始侦听单个SAVE_FORM_FULFILLED,这表明表单已保存(稍后将开始)。收到后,我们mergeMap(或switchMap在这种情况下无关紧要)将其加载到调用中以加载其他数据loadOtherDataSomehow()并进行常规业务。最后,启动我们正在等待的表单的实际保存的窍门是startWith()在整个链的末尾添加一个- 它将发出并分派实际保存表单的操作。
LOAD_OTHER_DATA
SAVE_FORM_FULFILLED
mergeMap
switchMap
loadOtherDataSomehow()
startWith()
const saveFormEpic = (action$, store) => action$ .ofType('SAVE_FORM') .switchMap(() => saveFormSomeHow(store.getState().formDataSomewhere) .map(details => ({ type: 'SAVE_FORM_FULFILLED' })) ); const loadOtherDataEpic = action$ => action$ .ofType('LOAD_OTHER_DATA') .switchMap(() => action$.ofType('SAVE_FORM_FULFILLED') .take(1) // don't listen forever! IMPORTANT! .mergeMap(() => loadOtherDataSomeHow() .map(otherData => ({ type: 'LOAD_OTHER_DATA_FULFILLED', payload: otherData })) ) .startWith({ type: 'SAVE_FORM' }) );
您没有提到加载和保存的工作方式,因此这只是您需要针对用例进行修改的伪代码。