处理由 from() 创建的 observable 中的 Promise 抛出的错误

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)

Daf*_*Cao 5

您可以将错误回调附加到Observable.subscribe().

Rx.Observable.from(Promise.reject('Boo!'))
    .subscribe(val => {
        console.log('success');
    },
    err => {
        console.log(err);
    });
// Boo!
Run Code Online (Sandbox Code Playgroud)