Hen*_*rik 5 javascript error-handling promise observable angular
我正在尝试在 Angular 应用程序中使用 AngularFire 库。一些 AngularFire 调用返回承诺,我想将它们作为可观察量处理,而不是为了整个应用程序的一致性。我正在使用 rxjs v6
使用from()效果很好,并提供预期的行为,除非发生错误。
如果 Promise 抛出异常,则可观察对象似乎看不到它,并且堆栈跟踪会转储到控制台中,并显示Error: Uncaught (in promise)。
我的第一次尝试
返回 Promise 的 AngularFire 调用:
deleteCampaign(id: string) {
return from(this.campaignCollection.doc(id).delete());
}
Run Code Online (Sandbox Code Playgroud)
调用代码:
deleteCampaign(id: string) {
return this.dataStorageService.deleteCampaign(id)
.pipe(
catchError(
err => {
console.log('error when deleting campaign');
console.log(err);
return throwError(err);
}
)
);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我在控制台中获取堆栈跟踪并且catchError从不触发。
我的第二次尝试
我catch在 内的承诺中添加了 a from,然后尝试将错误作为可观察的重新抛出,因此它看起来像这样:
deleteCampaign(id: string) {
return from(this.campaignCollection.doc(id).delete().catch(
err => {
throwError(err);
}
));
}
Run Code Online (Sandbox Code Playgroud)
我的第三次尝试
很像第二次尝试,但我尝试抛出一个简单的 JavaScript 错误。然而,这导致了相同的堆栈跟踪,并且它也没有被可观察者拾取。
deleteCampaign(id: string) {
return from(this.campaignCollection.doc(id).delete().catch(
err => {
throw(err);
}
));
}
Run Code Online (Sandbox Code Playgroud)
这阻止了堆栈跟踪的发生,因为现在承诺正在捕获它,但调用代码仍然看不到错误。
我是否以错误的方式处理这个问题?我假设通过使用from()所有错误处理都可能发生在可观察中,并且我可以不理会承诺。
我需要能够: 1. 在返回承诺的地方没有错误处理代码,并让可观察者处理它。1. 让 Promisecatch块能够重新抛出可观察对象捕获的错误。
这是得出的解决方案:
从前端组件中,使用error回调处理传递的错误subscribe
onDelete(id: string) {
this.loadingCampaigns = true;
this.campaignService.deleteCampaign(id).subscribe(
_ => {},
err => {
console.log('error detection from the component');
}
);
}
Run Code Online (Sandbox Code Playgroud)
从活动服务中,tap()可以记录错误或以其他方式记录错误:
deleteCampaign(id: string) {
return this.dataStorageService.deleteCampaign(id)
.pipe(
tap(null, () => {console.log('tapped the error');} ),
);
}
Run Code Online (Sandbox Code Playgroud)
最后,从数据存储组件中什么都不做:
deleteCampaign(id: string) {
return from(this.campaignCollection.doc(id).delete());
}
Run Code Online (Sandbox Code Playgroud)
您可以将错误回调附加到Observable.subscribe().
Rx.Observable.from(Promise.reject('Boo!'))
.subscribe(val => {
console.log('success');
},
err => {
console.log(err);
});
// Boo!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3605 次 |
| 最近记录: |