我有两个异步请求,想写一个史诗来完成像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 :(得分: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:很多)。但是,在您的示例中,您已经将响应转换为fetchData
帮助程序中的操作 - 再次执行此操作会将操作包装在另一个操作中,而不是您想要的操作。当你进行重构时,这看起来像是一个bug。
除此之外,实际上还不清楚你打算做什么。如果您还有其他问题,则需要描述您希望实现的目标。