api 2中的api调用失败时如何捕获错误

时间:2019-04-02 10:43:58

标签: angular api rxjs

我正在开发一个扫描二维码的应用程序。我有专用于扫描仪设备的服务,可以在其中扫描数据。

this.dataWedge.scanResult$
      .pipe(
        tap(_ => (this.scanning = false)),
        filter(_ => this.assignState.getAssign() === this.assignState.Default),
        switchMap(scanData =>
          this.api.callApi(
            PurchaseOrderQuery,
            {
              DataString: scanData.DataString
            }
          )
        )
      )
      .subscribe(purchaseOrder => {
        this.scannedResult$.next(purchaseOrder);
      });

问题在于,当我传递数据库中不存在的数据字符串时,api调用将失败(应该如此),但是它永远不会在订阅中进行。失败时如何从api捕获错误响应?是因为switchMap吗?

2 个答案:

答案 0 :(得分:1)

此处为示例

     this.dataWedge.scanResult$
     .pipe(
     tap(_ => (this.scanning = false)),
     filter(_ => this.assignState.getAssign() === this.assignState.Default),
     switchMap(scanData =>
       this.api.callApi(
        PurchaseOrderQuery,
        {
          DataString: scanData.DataString
        }
      )
     )
    )
    .subscribe(purchaseOrder => {
     this.scannedResult$.next(purchaseOrder);
    }, err {
           console.log(err); // here you will get the error if api call fails 
    });

答案 1 :(得分:1)

订阅包含三个回调:

xxx().subscribe(
  response => { ... }, // Request completed
  error => { ... }, // Request error
  () => { ... }, // Triggered in any case (like a "finally" from a try-catch block)
);

这是您管理错误的方式。

您还可以通过catchError保持流:

xxx().pipe(
  catchError(err => of('some value')),
);

这将使流以“某些值”而不是流的值继续。