【问题标题】:Angular 12/Typescript/rxjs: error handling of nested Promises and rxjs ObservableAngular 12/Typescript/rxjs:嵌套 Promises 和 rxjs Observable 的错误处理
【发布时间】:2021-11-02 14:48:48
【问题描述】:

我混合了嵌套的 Promise 和订阅,我只想做以下事情:

  • 调用我的函数 bar() 并了解它是否完全成功,或者是否发生错误

目前的做法: 目前我的 bar() 返回一个布尔 Observable,我分别处理每个错误,对于通过 .catch 的 Promise,对于通过错误句柄的 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() 函数调用是否在没有任何错误的情况下完成。有没有更好的方法来完全处理嵌套错误?

提前致谢

【问题讨论】:

    标签: angular typescript promise rxjs observable


    【解决方案1】:

    我认为这可以简洁地写成:

    this.httpHandler.newFoo().pipe(
      switchMap(data =>
        from(this.bar(data)).pipe(
          switchMap(() =>
            this.httpHandler.updateBar().pipe(
              mapTo(true)
            )
          )
        )
      ),
      catchError(() => of(false))
    )
    

    要从一个 Promise 中创建一个 observable,请使用 from()。使用switchMap() 在可观察对象之间进行转换。那么这只是一个链接你的电话的问题:

    this.httpHandler.newFoo() -> this.bar() -> this.httpHandler.updateBar()

    最后返回true,否则返回false 任何错误。

    【讨论】:

    • switchMap 实际上内部使用了from,所以你不需要使用它。此外,看起来您不需要嵌套管道。所以我认为你可以简化为:this.httpHandler.newFoo().pipe(switchMap(), switchMap(), mapTo(), catchError());
    • @BizzyBob 嵌套对我来说是一种风格选择,因此调用的边界有明确的划分,或者我是否需要响应处理程序的输入。这也有效。
    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多