【问题标题】:How to trap errors from chained rxjs observables when using combineLatest?使用 combineLatest 时如何从链接的 rxjs 可观察对象中捕获错误?
【发布时间】:2017-01-20 03:41:46
【问题描述】:

this post之后,我有以下

Observable.combineLatest(
        this.translate.get("key1"),
        this.translate.get(""),
        this.translate.get("key3"),
        this.translate.get("key4")
    )
    .subscribe(([result1, result2, result3, result4]) => {
        console.log(result1);
        console.log(result2);
        console.log(result3);
        console.log(result4);
    },
      error => {
        console.log(`${error}`);            
   });  

在第 2 行我收到一个错误,但这似乎没有进入上面的 error 处理程序。不幸的是,我发现的示例和文档似乎不包括如何捕获错误(假设上述方法可行)。

有人对如何做到这一点有任何想法吗?

【问题讨论】:

    标签: angular ionic2 reactivex ng2-translate


    【解决方案1】:

    在我看来,this.translate.get("") 很可能正在验证一个论点,并将其抛出到可观察对象的“外部”(即在它甚至创建其可观察对象之前)。

    您可以使用如下代码验证错误处理:

    import "rxjs/add/observable/throw";
    
    Observable.combineLatest(
      this.translate.get("key1"),
      Observable.throw(new Error("Boom!")),
      this.translate.get("key3"),
      this.translate.get("key4")
    )
    .subscribe(
      ([result1, result2, result3, result4]) => {
        console.log(result1);
        console.log(result2);
        console.log(result3);
        console.log(result4);
      },
      error => {
        console.log(`${error}`);
      }
    );
    

    您可以验证this.translate.get("") 将错误抛出到可观察对象的“外部”,如下所示:

    import "rxjs/add/observable/defer";
    
    Observable.combineLatest(
      this.translate.get("key1"),
      Observable.defer(() => this.translate.get("")),
      this.translate.get("key3"),
      this.translate.get("key4")
    )
    .subscribe(
      ([result1, result2, result3, result4]) => {
        console.log(result1);
        console.log(result2);
        console.log(result3);
        console.log(result4);
      },
      error => {
        console.log(`${error}`);
      }
    );
    

    如果这是它正在做的事情,我想这是合理的行为,因为空键不太可能是有效的。更“内部”的错误可能会通过 observable 报告,并且应该由您传递给 subscribe 的错误回调处理。

    【讨论】:

    • 好的,我明白了。我尝试在整个批次周围添加一个普通的(非 rxjs 相关的)try/catch 块,并且错误确实进入了 catch。所以我想这就是我们在这里所能做的。
    • 您可以查看源代码以确保发生这种情况,但如果错误不是通过可观察对象抛出的,那么您无能为力 - 除了确保您通过在有效的密钥中。
    • 这是个好主意(看源码)。是的,如果密钥未定义或长度为零,则确实在最顶部会引发错误。我还发现了另一种方法instant()(我不知道这个),它只返回字符串 - 在文档中它只是)解释了如果你使用这个,需要确保异步文件加载已经完成。
    猜你喜欢
    • 2018-10-25
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多