2017-07-27 52 views
0

我有兩個異步請求,想寫史詩做的工作就像promise.all()redux-observable,如何做一個像promise.all()這樣的操作符?

const fetchData1 =() => (action$: ActionsObservable<any>, store: any) => (
    ajax.getJSON('../../mockData/promiseAll/data1.json').map((data: any) => { 
    return requestData1Success(data); 
    }) 
); 
const fetchData2 =() => (action$: ActionsObservable<any>, store: any) => (
    ajax.getJSON('../../mockData/promiseAll/data2.json').map((data: any) => { 
    return requestData2Success(data); 
    }) 
) 

const requestAllDataEpic = (action$: ActionsObservable<any>, store: any) => { 
    return action$.ofType(t.REQUEST_ALL_DATA) 
    .map((action) => action.payload) 
    .switchMap((names: string[]) => { 
     console.log(names); 

     return Observable.forkJoin([ 
     fetchData1()(action$, store), 
     fetchData2()(action$, store) 
     ]) 
     .map((results: any[]) => { 
      const [action1, action2] = results; 
      requestData1Success(action1); 
      requestData2Success(action2); 

     }); 
    }); 
}; 

但是,當我派遣行動,控制檯給我一個錯誤:

Uncaught TypeError: Cannot read property 'type' of undefined

我想原因是我不給中間件一個action對象,而是undefined

我該如何正確地做到這一點?

回答

0

在提供的例子,你是不是真的返回你的兩個動作,你就什麼都不返回:

.map((results: any[]) => { 
    const [action1, action2] = results; 

    // v----- not returning either of these 
    requestData1Success(action1); 
    requestData2Success(action2); 
}); 

map不能用於連續兩個動作發出,因爲它是1:1而不是1:多(mergeMap,switchMap,concatMap等是1:很多)。但是,在您的示例中,您已將響應轉換爲您的幫助器中的操作 - 再次執行操作會將操作包裝到另一個操作中,而不是您想要的操作。這在重構時看起來像一個錯誤。

除此之外,它實際上並不清楚你打算做什麼。如果您還有其他問題,您需要描述您希望達到的目標。

相關問題