Angular 6 - HTTP 拦截器和网络 :: ERR_TIMED_OUT
Angular 6 - HTTP Interceptor and net :: ERR_TIMED_OUT
我的问题是最近一直在摸不着头脑的事情 --
在我的拦截器中,我有解析和处理某些错误的代码,并会根据错误的状态代码等以某些方式执行操作(我没有包含此代码,因为它实际上没有任何用途这个问题,但如果有人有充分的理由说明为什么我应该包括它,我绝对可以。
我想弄清楚如何在我的拦截器中处理 net :: ERR_TIMED_OUT
(使用 google chrome / opera)。我已经追踪到可以判断正在构建请求并正在 'handled' 的点,但在那之后,请求和响应都消失了。我最初的想法是某处有一个 XMLHttpRequest
错误,它以某种方式被抑制并且响应被丢弃。
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const intercepted = this.setHeaders(req);
return this.SetPendingRequests(next.handle(intercepted))
.pipe(catchError((err): Observable<HttpEvent<any>> => {
return this.ParseErrorResponse(err);
}));
}
我也试过向它添加 finalize(() => {})
并且在所有情况下都工作正常,除了这个,其中 ERR_TIMED_OUT
基本上似乎决定所有事情都必须为此停止。
我也试过直接连接到 XMLHttpRequest
,但 angular 并没有太客气 - 因为我觉得问题的根源可能源于它本身。
所有 google/Whosebug 搜索几乎都指向它是一个本地问题,但我觉得好像应该有一些方法可以在我的代码中处理它,所以如果用户要 运行在使用我的应用程序时出现此错误,我将能够适当地处理它。基本上,我只想要 ERR_TIMED_OUT
的任何请求(奇怪的是,其他浏览器基本错误 return 是 'Unknown Error' 类型的错误——这是我发现的唯一奇怪的异常值只是停止一切。我想看看是否有其他人 运行 了解这个问题/愿意帮助我解决这个问题。
感谢您对此事的任何帮助,并提前致谢,
我的问题的快速更新 -- 我似乎在 RxJS 中找到了解决方案。事实证明 RxJS 拥有一切,事实上,这似乎解决了我遇到的问题(在构建其他东西以对某些错误做出反应等)
我构建的拦截器代码看起来像这样..(我选择 20000 作为 Chrome 的默认值,在我的实例中浏览器超时为 30 秒...)
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const intercepted = this.setHeaders(req);
return this.SetPendingRequests(next.handle(intercepted))
.pipe(timeout(20000),
catchError((err): Observable<HttpEvent<any>> => {
return this.ParseErrorResponse(err);
}));
}
超时运算符应该 return 一个可用的错误而不是将 1 和 0 关闭到 space 并且不能保证它们在实际超时的情况下会 return .这也会覆盖任何基于浏览器的超时(如果我的网络调用在 20 秒内从 RxJS 操作员超时,它不会在浏览器中再次超时。错误被抛出并且生活继续)。能够对错误做出反应也是一件很棒的事情我发现错误处理,所以这让它变得更好。
还值得注意的是,这适用于网络调用 - 这也是我目前主要使用它的地方。
一如既往,我对更好/更优雅的解决方案持开放态度 -- 毕竟我是一名工程师,而且永远是一名学生,但希望这对遇到与我类似问题的人有所帮助。
我的问题是最近一直在摸不着头脑的事情 --
在我的拦截器中,我有解析和处理某些错误的代码,并会根据错误的状态代码等以某些方式执行操作(我没有包含此代码,因为它实际上没有任何用途这个问题,但如果有人有充分的理由说明为什么我应该包括它,我绝对可以。
我想弄清楚如何在我的拦截器中处理 net :: ERR_TIMED_OUT
(使用 google chrome / opera)。我已经追踪到可以判断正在构建请求并正在 'handled' 的点,但在那之后,请求和响应都消失了。我最初的想法是某处有一个 XMLHttpRequest
错误,它以某种方式被抑制并且响应被丢弃。
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const intercepted = this.setHeaders(req);
return this.SetPendingRequests(next.handle(intercepted))
.pipe(catchError((err): Observable<HttpEvent<any>> => {
return this.ParseErrorResponse(err);
}));
}
我也试过向它添加 finalize(() => {})
并且在所有情况下都工作正常,除了这个,其中 ERR_TIMED_OUT
基本上似乎决定所有事情都必须为此停止。
我也试过直接连接到 XMLHttpRequest
,但 angular 并没有太客气 - 因为我觉得问题的根源可能源于它本身。
所有 google/Whosebug 搜索几乎都指向它是一个本地问题,但我觉得好像应该有一些方法可以在我的代码中处理它,所以如果用户要 运行在使用我的应用程序时出现此错误,我将能够适当地处理它。基本上,我只想要 ERR_TIMED_OUT
的任何请求(奇怪的是,其他浏览器基本错误 return 是 'Unknown Error' 类型的错误——这是我发现的唯一奇怪的异常值只是停止一切。我想看看是否有其他人 运行 了解这个问题/愿意帮助我解决这个问题。
感谢您对此事的任何帮助,并提前致谢,
我的问题的快速更新 -- 我似乎在 RxJS 中找到了解决方案。事实证明 RxJS 拥有一切,事实上,这似乎解决了我遇到的问题(在构建其他东西以对某些错误做出反应等)
我构建的拦截器代码看起来像这样..(我选择 20000 作为 Chrome 的默认值,在我的实例中浏览器超时为 30 秒...)
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const intercepted = this.setHeaders(req);
return this.SetPendingRequests(next.handle(intercepted))
.pipe(timeout(20000),
catchError((err): Observable<HttpEvent<any>> => {
return this.ParseErrorResponse(err);
}));
}
超时运算符应该 return 一个可用的错误而不是将 1 和 0 关闭到 space 并且不能保证它们在实际超时的情况下会 return .这也会覆盖任何基于浏览器的超时(如果我的网络调用在 20 秒内从 RxJS 操作员超时,它不会在浏览器中再次超时。错误被抛出并且生活继续)。能够对错误做出反应也是一件很棒的事情我发现错误处理,所以这让它变得更好。
还值得注意的是,这适用于网络调用 - 这也是我目前主要使用它的地方。
一如既往,我对更好/更优雅的解决方案持开放态度 -- 毕竟我是一名工程师,而且永远是一名学生,但希望这对遇到与我类似问题的人有所帮助。