我的问题是我最近一直在挠头的事情——
在我的拦截器中,我有解析和处理某些错误的代码,并将根据错误的状态代码以某些方式进行操作,等等(我没有包含此代码,因为它对这个问题没有真正的作用,但如果有人有充分的理由说明我为什么应该包含它,我绝对可以
我正试图弄清楚如何在我的拦截器中处理net :: ERR_TIMED_OUT
(使用谷歌chrome/opera)。我已经追踪到一个点,我可以判断请求正在构建和"处理",但在那之后,请求和响应都消失了。我最初的想法是,某个地方有一个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/stackoverflow搜索都表明这是一个本地问题,但我觉得应该有一些方法在我的代码中处理它,所以如果用户在使用我的应用程序时遇到这个错误,我可以适当地处理它。基本上,我只想要ERR_TIMED_OUT
的任何请求(奇怪的是,其他浏览器基本错误都会返回"未知错误"类型的错误——这是我发现的唯一一个奇怪的异常值,它只是简单地停止了一切。我想看看是否有其他人遇到了这个问题/愿意帮助我找出它。
感谢您对此事的帮助,并提前表示感谢,
我的问题的快速更新——我似乎在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);
}));
}
超时操作员应该返回一个可用的错误,而不是在实际超时的情况下将1和0发射到太空中,而不能保证它们会返回。这也会覆盖任何基于浏览器的超时(如果我的网络呼叫在20秒内从RxJS操作员超时,它将不会在浏览器中再次超时。会抛出错误,生活会继续)。能够对错误做出反应也是我在错误处理方面发现的一件很棒的事情,所以这会让事情变得更好。
同样值得注意的是,这适用于网络通话——这主要是我目前使用它的地方。
和往常一样,我对更好/更优雅的解决方案持开放态度——毕竟我是一名工程师,永远是一名学生,但希望这能帮助到和我有类似问题的人。