2017-02-16 75 views
1

首先为这个真棒图书馆提供许多道具!尽管如此,我仍然在努力应对用例。我想先致电另一部史诗,然后等待它完成,然后继续当前的史诗。比方说,我有一个用户可以改变的表单。在将其他数据加载到表单之前,我想先保存当前的更改。对此有何想法?从其他史诗中调用史诗

回答

3

听起来像你想要的:如果一个史诗想要开始另一个史诗般的工作,并且 等待它完成继续之前。

一种方法是(使用伪名称),当接收到初始动作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' 
     }) 
    ); 

你没有提到你的加载和保存是如何工作的,所以这只是你需要修改你的用例的伪代码。

+0

感谢您的彻底解答!我可以在此之上再添加一个小问题吗?保存是可选的,如“当用户没有自己保存它时我希望史诗般为他做”。所以我查看了Observer.if()方法,看起来很适合,但我无法想象在“loadOtherDataEpc”中可选。 – robinvdvleuten

+0

只需使用一个简单的if/else条件 – jayphelps

+0

https://gist.github.com/jayphelps/7e708b59c17b4f327558e7e4501a0536 – jayphelps

相关问题