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
種類的圖案實現的效果
有沒有更好的方法在單個史詩上執行此操作?
是你的'map'只在你的問題中調用錯字嗎?例如其中一個'map(({address,place_id})=> {type:Types.LOCATION_GEOCODED,address,place_id})'是一個解析錯誤,返回的對象需要用圓括號包裝。這也幾乎可以肯定是一個錯字:'{type:Types.NEW_CURRENT_LOCATION,store.getState()。location}'這不是一個分析錯誤,但實際上創建一個帶有標籤語句的塊,然後用外部調用來獲得該狀態,沒有回報價值。完全不是你想要的:) – jayphelps
是一個錯字,抱歉。在真正的例子中,我正在使用reduxsauce並調用創建者函數,想着只是把計劃對象保持簡單。我會修正這個例子 –