Angular 6-HTTP拦截器和网络:: ERR_TIMED_OUT

时间:2019-01-09 19:39:44

标签: angular http xmlhttprequest timeout interceptor

我的问题是我最近一直在挠头-

在我的拦截器中,我有用于解析和处理某些错误的代码,并将根据错误的状态代码以某种方式执行操作,等等(我未包含此代码,因为它并没有真正起到解决此问题的作用。 ,但是如果有人对我为什么要加入它有充分的理由,我绝对可以。

我试图弄清楚如何在拦截器中处理net :: ERR_TIMED_OUT(使用google 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的过程,并且角度并不太好-因为我认为问题的根源可能在于该问题本身。

所有google / stackoverflow搜索都几乎表明这是一个本地问题,但是我觉得好像应该在我的代码中使用某种方法来处理它,因此,如果用户在使用我的应用程序时遇到此错误,将能够适当地处理。基本上,我只想要任何对ERR_TIMED_OUT的请求(奇怪的是,其他浏览器基础错误返回的错误类型为“未知错误”,这是我发现的唯一异常的东西,它只是停止所有操作。我我想看看是否有人遇到了这个问题/愿意帮助我进行嗅探。

感谢您对此事的任何帮助,并提前致谢,

1 个答案:

答案 0 :(得分:1)

我的问题的快速更新-我似乎已经在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运算符超时,则它将不会再次在浏览器中超时。将引发错误并继续存在)。我发现错误处理也能够对错误做出反应,这也很棒。

还值得注意的是,该功能适用​​于网络通话-这是我目前正在使用的主要通话方式。

一如既往,我乐于寻求更好/更优雅的解决方案-我毕竟是一名工程师,永远都是学生,但是希望这对遇到类似问题的人有所帮助。