2017-02-16 42 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

相關問題