2017-06-13 64 views
3

我對React和Redux很熟悉,但是對於RxJS和可重複觀察是很新的。如何鏈接動作和史詩?

我的工作,我已經成功的東西,看起來像這樣來解決流量:

const reducer = (state, action) => { 
    switch(action.type) { 
    // some other cases here 
    case Types.LOCATION_GEOCODED: 
     const { address, place_id } = action 
     return {...state, address, place_id } 
    } 
} 

const updateLocationEpic = (action$, store) => 
    action$.ofType(Types.UPDATE_LOCATION) 
    .mergeMap((action) => 
     Observable.fromPromise(reverseGeocode(store.getState().location)) 
     .map(({address, place_id}) => ({type: Types.LOCATION_GEOCODED, address, place_id})) 
    ) 

const broadcastLocationEpic = (action$, store) => 
    action$.ofType(Types.LOCATION_GEOCODED) 
    .map((action) => ({type: Types.NEW_CURRENT_LOCATION, store.getState().location})) 

第一史詩發出異步請求後LOCATION_GEOCODED動作,減速,然後「完成」位置信息,最後第二個史詩從狀態採取完整的位置,並廣播它。

關鍵是確保NEW_CURRENT_LOCATION操作在觸發之後由於它需要查詢剛剛更新的狀態,因此reducer已經處理了上一個操作(LOCATION_GEOCODED)。

上面的代碼工作,但我不知道它是否可以某種方式表達在一個史詩,特別是因爲我有另一個案件,我需要等待兩個並行請求產生的行動,所以我需要做類似於你將用Promise.all種類的圖案實現的效果

有沒有更好的方法在單個史詩上執行此操作?

+0

是你的'map'只在你的問題中調用錯字嗎?例如其中一個'map(({address,place_id})=> {type:Types.LOCATION_GEOCODED,address,place_id})'是一個解析錯誤,返回的對象需要用圓括號包裝。這也幾乎可以肯定是一個錯字:'{type:Types.NEW_CURRENT_LOCATION,store.getState()。location}'這不是一個分析錯誤,但實際上創建一個帶有標籤語句的塊,然後用外部調用來獲得該狀態,沒有回報價值。完全不是你想要的:) – jayphelps

+0

是一個錯字,抱歉。在真正的例子中,我正在使用reduxsauce並調用創建者函數,想着只是把計劃對象保持簡單。我會修正這個例子 –

回答

0
const updateLocationEpic = (action$, store) => 
    action$.ofType(Types.UPDATE_LOCATION) 
     .mergeMap((action) => Observable.merge(
      Observable.fromPromise(reverseGeocode(store.getState().location)) 
       .map(({ address, place_id }) => ({ type: Types.LOCATION_GEOCODED, address, place_id })), 

      action$.ofType(Types.LOCATION_GEOCODED) 
       .map((action) => ({ type: Types.NEW_CURRENT_LOCATION, location: store.getState().location })) 
     )); 
相關問題