Redux 在超时时重新执行可观察重试

Redux 在超时时重新执行可观察重试,redux,rxjs,rxjs5,redux-observable,Redux,Rxjs,Rxjs5,Redux Observable,我希望使用redux observable来处理ajax超时,这样,如果超时发生(比如10秒后),它将再次重试请求两次(每次都触发SAVE\u RETRYING操作,以便UI可以通知用户它正在重试) 对于任何其他类型的错误,或者如果我们已经重试了两次,它应该失败并触发SAVE\u FAILURE操作 如果我使用store.dispatch触发SAVE\u RETRYING操作,我可以让它工作,但是收到了关于这一点的弃用警告,我有点难以找到正确的方法(将SAVE\u RETRYING添加到epic

我希望使用redux observable来处理ajax超时,这样,如果超时发生(比如10秒后),它将再次重试请求两次(每次都触发
SAVE\u RETRYING
操作,以便UI可以通知用户它正在重试)

对于任何其他类型的错误,或者如果我们已经重试了两次,它应该失败并触发
SAVE\u FAILURE
操作

如果我使用
store.dispatch
触发
SAVE\u RETRYING
操作,我可以让它工作,但是收到了关于这一点的弃用警告,我有点难以找到正确的方法(将
SAVE\u RETRYING
添加到epic返回的流中)

以下是我所做的(简化):


如何将
SAVE\u RETRYING
操作升级到主流?Thx.

这并不理想,但您可以使用
catch
和未记录的第二个参数(这是可观察到的源)重新订阅。我不喜欢的缺点是,您必须在
mergeMap
回调闭包中计算重试次数

function saveEpic(action$, store) {
  return action$.ofType('SAVE_CLICKED')
    .mergeMap(action => {
      let retries = 0;
      return ajax({
        url: '/a-long-request',
      })
        .timeout(10000)
        .map(() => ({ type: 'SAVE_SUCCESS' }))
        .catch((error, source) => {
          retries += 1;
          if (retries >= 2 || error.name !== 'TimeoutError') {
            return Observable.of({ type: 'SAVE_FAILURE' });
          }

          return source.startWith({ type: 'SAVE_RETRYING', count: retries });
        })
        .startWith({ type: 'SAVE_STARTED' });
    });
}

这并不理想,但您可以使用
catch
和未记录的第二个参数(可观察的源)重新订阅。我不喜欢的缺点是,您必须在
mergeMap
回调闭包中计算重试次数

function saveEpic(action$, store) {
  return action$.ofType('SAVE_CLICKED')
    .mergeMap(action => {
      let retries = 0;
      return ajax({
        url: '/a-long-request',
      })
        .timeout(10000)
        .map(() => ({ type: 'SAVE_SUCCESS' }))
        .catch((error, source) => {
          retries += 1;
          if (retries >= 2 || error.name !== 'TimeoutError') {
            return Observable.of({ type: 'SAVE_FAILURE' });
          }

          return source.startWith({ type: 'SAVE_RETRYING', count: retries });
        })
        .startWith({ type: 'SAVE_STARTED' });
    });
}
工作起来很有魅力:)如果没有人能在接下来的一段时间内提供一个没有缺点的答案,我会接受这个答案。工作起来很有魅力:)如果没有人能在接下来的一段时间内提供一个没有缺点的答案,我会接受这个答案。