重试Observable重试时,不会导致重试ajax调用

时间:2018-08-17 09:50:35

标签: rxjs reactive-programming redux-observable

根据redux-observable,我有这部史诗:

export const someEpic = action$ => {
  return action$.pipe(
    ofType('FETCH_DATA'),
    switchMap(({ payload: { filter, bookingCenter } }) => {
      return concat(
        of(searchInProgress()),
        from(
          ApiManager.call('/v1/some-data', {
            method: 'GET',
            schema: false,
            params: {
              term: filter,
              bookingCenter,
            },
          })
        ).pipe(
          map(response => {
            if (!response) throw 'No result';
            return response;
          }),
          map(({ _embedded }) => updateResult(_embedded)
        )
      ).pipe(retry(2));
    })
  );
};

如您所见,我有一个重试运算符。基本上,如果服务器未返回任何响应,则会抛出错误并重试。

但是,它仅部分起作用,即在控制台中,我看到调度了searchInProgress动作,但是用from创建的第二可观察值不再被执行。

ApiManager.call返回常规fetch API承诺。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

解决方案是使用defer,这将推迟从Promise创建可观察的物体:

    defer(() =>
      ApiManager.call('/v1/some-data', {
        method: 'GET',
        schema: false,
        params: {
          term: filter,
          bookingCenter,
          limit: 500,
        },
      })
    )