2016-11-30 28 views
21

yılında sevk birden redux eylemler ben redux-observable katman tek Destanı birden redux eylemleri sevk yolunda arıyorum.redux-gözlemlenebilir - Tek epik

ı Destanını aşağıdakilere sahip varsayalım. Her zaman, SEARCH olayı gerçekleştiğinde, Epic arka uçtan veri yükler ve RESULTS_LOADED eylemini gönderir.

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

Şimdi, searchPromise çözülürse zaman sevk ek işlem gerektiğini düşünelim.

bunu yaparken basit yolu RESULTS_LOADED dinlemek ve ikinci eylem sevk edecek ikinci bir destan var gibi gözüküyor. Bunun gibi:

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

Bu basit örnekte oldukça kolaydır. Fakat Epikler büyüdüğünde, kendimi başka eylemleri tetiklemek için pek çok redux eylemi olduğunu bulmaya eğilimliyim. Ayrıca, rxjs kodunun bir kısmı tekrarlanmalıdır. Bunu biraz çirkin buluyorum.

Yani, benim sorum: Tek Epic birden redux eylemleri sevk için bir yol var mı?

+0

ngrx/etkileri angular2 tabanlı uygulamalar için bunun için kısayollar uygular, bilmiyorum? –

cevap

16

Eğer bire-bir giriş/çıkış oranının yapmak bir gereksinim yoktur. Eğer gerekiyorsa, böylece (aka flatMap) mergeMap kullanarak birden eylemleri yayabilir için:

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)) 
     )) 
    ) 

Not bir Promise, Array veya iterable kabul edebilir ayrıca gözlemlenebilir kabul eden Rx operatörü; Akarlarsa onları tüketiyorlardı. Bu yüzden aynı etkiyi yerine bir dizi kullanabilirsiniz: Kişisel stil tercihleri ​​ve kullanım durumuna bağlı bir kullandığınız

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

. benzer kütüphaneler redux-gözlemlenebilir için varsa

+6

Sonuç değişkeninin iç ok işlevinde flatMap'ta olması veri olmaz mı? –

İlgili konular