【问题标题】:How to catch a Timeout Error with Redux-Observable + RxJS + Axios set-up?如何使用 Redux-Observable + RxJS + Axios 设置捕获超时错误?
【发布时间】:2018-10-26 16:37:24
【问题描述】:

使用 Redux-Observable + RxJS + Axios 调用超时返回的错误不包含任何状态码等。整个错误响应整体为[TimeoutError: Timeout has occurred]。如何捕获该响应的错误以显示通知?史诗如下:

const fetchUserEpic = (action$, state$) =>
  action$.pipe(
    ofType('FETCH_USER'),
    mergeMap(() =>
      from(axios.get(`/user/`)).pipe(
        timeout(5000),
        map(response => ({
          type: 'FETCH_USER_SUCCESS',
          data: response.data
        })),
        catchError(error =>
          of({
            type: 'FETCH_USER_ERROR',
            error
          })
        )
      )
    )
  );

【问题讨论】:

  • 如果因为timeout(5000)而超时,则无法响应(这就是超时的原因)。
  • 我明白了,但我认为 Axios 或 RxJs 会发回一个带有超时状态代码等的对象,以便可以轻松捕获它?如果没有,我必须检查错误消息是否包含“超时”一词以及是否显示超时图形,例如
  • 是 RxJS 造成了超时。这与 Axios 完全无关。
  • 好的,谢谢。这有助于了解这么多

标签: rxjs axios redux-observable


【解决方案1】:

传递到catchError 处理程序的error 对象有两个字符串属性:message 和name。

整个对象基本上是这样的:

{
    message: 'Timeout has occurred',
    name: 'TimeoutError'
}

参考TimeoutError.ts implementation。

因此,您可以检查清楚地处理 rxjs 超时:

.catchError(error => {
    if (error.name === 'TimeoutError') {
        // handle rxjs timeout
    }
    ...
})

(至少这就是我正在为与您非常相似的用例所做的事情。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2016-12-12
    • 2020-12-30
    • 1970-01-01
    • 2019-04-05
    • 2018-03-25
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多