2017-07-27 62 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:很多)。但是,在您的示例中,您已将响应转换为您的帮助器中的操作 - 再次执行操作会将操作包装到另一个操作中,而不是您想要的操作。这在重构时看起来像一个错误。

除此之外,它实际上并不清楚你打算做什么。如果您还有其他问题,您需要描述您希望达到的目标。

相关问题