首页 > 解决方案 > 在 Observable.interval() 中捕获 http 错误

问题描述

我有一块每小时运行一次到给定网址的块。基本上,现在如果找不到 url 或通常以错误 500 响应,我会收到错误消息。该应用程序使用服务工作者,但如果提供的 url 存在(404/500 触发以下消息),则可以正常工作:

Failed to load resource: net::ERR_INVALID_RESPONSE
ERROR Error: Uncaught (in promise): TypeError: Failed to register a ServiceWorker: An unknown error occurred when fetching the script.
TypeError: Failed to register a ServiceWorker: An unknown error occurred when fetching the script.
    at resolvePromise (zone.js:831)
    at eval (zone.js:741)
    at eval (zone.js:757)
    at ZoneDelegate.invoke (zone.js:391)
    at Object.onInvoke (core.js:4760)
    at ZoneDelegate.invoke (zone.js:390)
    at Zone.run (zone.js:150)
    at eval (zone.js:889)
    at ZoneDelegate.invokeTask (zone.js:423)
    at Object.onInvokeTask (core.js:4751)

在我的控制台中。我怎样才能优雅地捕捉到错误?

Observable.interval(3000)
      .subscribe((data) => {
         this.http.get('http://localhost:87887/profile/1/') // doesnt exist
           .subscribe((data) => {
             this.pingStream.next(true);
           },
           err => {

             if (err.status == 500){
              this.pingStream.next(false);
             }
             else{
               this.pingStream.next(true);
             }

           }
           );
      });

标签: angularangular5

解决方案


如果您希望链在出现错误后继续运行,那么interval(3000)您必须将其放入catchError内部concatMap(或者mergeMap也可以正常工作)。然后,这取决于发生错误时您想要做什么。您可以通过返回EMPTY或将其转换为next通知来忽略它:

import { EMPTY } from 'rxjs';
...

// Assuming you're using RxJS 6
interval(3000).pipe(
  concatMap(() => this.http.get('http://localhost:87887/profile/1/').pipe(
    catchError(error => {
      if (err.status == 500){
        this.pingStream.next(false);
      } else {
        this.pingStream.next(true);
      }
      return EMPTY;
    })
  ))
).subscribe(data => this.pingStream.next(true));

推荐阅读