Angular12/Typescript/rxjs:嵌套Promises和rxjs Observable的错误处理
Angular 12/Typescript/rxjs: error handling of nested Promises and rxjs Observable
我混合使用了嵌套的 Promises 和订阅,我只想执行以下操作:
- 调用我的函数 bar() 并了解它是否完全成功,或者是否发生错误
当前方法:
目前我的 bar() returns 是一个布尔 Observable,我分别处理每个错误,对于 Promise 通过 .catch,对于 rxjs Observable 通过错误句柄:
foo(): void {
this.bar.subscribe((data: boolean) => console.log('the function call bar() was ' + data));
}
bar(): Observable<boolean> {
let subject = new Subject<boolean>();
this.httpHandler.newFoo().subscribe(
(data) =>
this.bar(data)
.then((barData) =>
this.httpHandler.updateBar().subscribe(
(barData2) => subject.next(true),
(error) => subject.next(false)))
.catch(err => subject.next(false)),
(error) => subject.next(false));
return subject.asObservable();
}
显然这很混乱,而且为了了解 bar() 函数调用是否完成且没有任何错误的简单目的看起来有点矫枉过正。有没有更好的方法来完全处理嵌套错误?
提前致谢
我认为这可以简洁地写成:
this.httpHandler.newFoo().pipe(
switchMap(data =>
from(this.bar(data)).pipe(
switchMap(() =>
this.httpHandler.updateBar().pipe(
mapTo(true)
)
)
)
),
catchError(() => of(false))
)
要从 promise 中创建可观察对象,请使用 from()
。使用 switchMap()
在 observable 之间转换。那么这只是链接你的电话的问题:
this.httpHandler.newFoo()
-> this.bar()
-> this.httpHandler.updateBar()
并最终返回 true
,否则 false
任何错误。
我混合使用了嵌套的 Promises 和订阅,我只想执行以下操作:
- 调用我的函数 bar() 并了解它是否完全成功,或者是否发生错误
当前方法: 目前我的 bar() returns 是一个布尔 Observable,我分别处理每个错误,对于 Promise 通过 .catch,对于 rxjs Observable 通过错误句柄:
foo(): void {
this.bar.subscribe((data: boolean) => console.log('the function call bar() was ' + data));
}
bar(): Observable<boolean> {
let subject = new Subject<boolean>();
this.httpHandler.newFoo().subscribe(
(data) =>
this.bar(data)
.then((barData) =>
this.httpHandler.updateBar().subscribe(
(barData2) => subject.next(true),
(error) => subject.next(false)))
.catch(err => subject.next(false)),
(error) => subject.next(false));
return subject.asObservable();
}
显然这很混乱,而且为了了解 bar() 函数调用是否完成且没有任何错误的简单目的看起来有点矫枉过正。有没有更好的方法来完全处理嵌套错误?
提前致谢
我认为这可以简洁地写成:
this.httpHandler.newFoo().pipe(
switchMap(data =>
from(this.bar(data)).pipe(
switchMap(() =>
this.httpHandler.updateBar().pipe(
mapTo(true)
)
)
)
),
catchError(() => of(false))
)
要从 promise 中创建可观察对象,请使用 from()
。使用 switchMap()
在 observable 之间转换。那么这只是链接你的电话的问题:
this.httpHandler.newFoo()
-> this.bar()
-> this.httpHandler.updateBar()
并最终返回 true
,否则 false
任何错误。