redux-observable,如何做一个像promise.all()这样的运算符?

时间:2017-07-27 05:44:42

标签: 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

我该如何正确地做到这一点?

1 个答案:

答案 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。

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