我正在开发一个扫描二维码的应用程序。我有专用于扫描仪设备的服务,可以在其中扫描数据。
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
吗?
答案 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')),
);
这将使流以“某些值”而不是流的值继续。