2016-11-30 72 views
21

我正在尋找在單一Epic redux-observable中間件中調度多個redux動作的方式。redux-observable - 在單個史詩中調度多個redux動作

讓我們假設我有以下Epic。每次發生事件時,Epic都會從後端加載數據併發送RESULTS_LOADED操作。

searchEpic = (action$) => 
    action$ 
    .ofType('SEARCH') 
    .mergeMap(
     Observable 
     .fromPromise(searchPromise) 
     .map((data) => { 
      return { 
       type: 'RESULTS_LOADED', 
       results: data 
      } 
     }) 
    ) 

現在,我們假設我需要在解決searchPromise時調度附加動作。

這樣做最簡單的方法似乎有第二個史詩,將聽取RESULTS_LOADED並派遣第二個動作。像這樣:

resultsLoadedEpic = (action$) => 
    action$ 
    .ofType('RESULTS_LOADED') 
    .map(({results} => { 
     return { 
      type: 'MY_OTHER_ACTION', 
      results 
     } 
    }) 

在這個簡單的例子中,它很容易。但是,當Epics增長時,我傾向於發現自己有很多redux動作,其唯一目的是觸發其他動作。此外,一些rxjs代碼需要重複。我覺得這有點難看。

所以,我的問題:有沒有辦法在單個Epic中分派多個redux動作?

+0

ngrx/effects爲基於angular2的應用程序實現此快捷方式,我不知道類似的庫是否存在redux-observable? –

回答

16

沒有要求您建立一對一的進/出比。所以,如果你需要,你可以使用發射mergeMap(又名flatMap)多個動作:

const loaded = (results) => ({type: 'RESULTS_LOADED', results}); 
const otherAction = (results) => ({type: 'MY_OTHER_ACTION', results}); 

searchEpic = (action$) => 
    action$ 
    .ofType('SEARCH') 
    .mergeMap(
     Observable 
     .fromPromise(searchPromise) 
     // Flattens this into two events on every search 
     .mergeMap((data) => Observable.of(
      loaded(data), 
      otherAction(data)) 
     )) 
    ) 

需要注意的是,接受一個可觀察還可以接受一個承諾,陣列,或可迭代任何的Rx操作;如果它們是流,則將它們消費。所以我們可以使用數組來代替同樣的效果:

.mergeMap((data) => [loaded(data), otherAction(data)]) 

您使用哪一個取決於您的個人風格偏好和用例。

+6

flatMap中的內部箭頭函數的結果變量是不是數據? –

相關問題