2017-01-20 84 views
2

this post继,我有以下如何在使用combineLatest时从链式rxjs observables中捕获错误?

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处理器上面。不幸的是,我发现的例子和doco似乎没有包括如何捕捉错误(假设上述方法会起作用)。

有没有人有关于如何做到这一点的任何想法?

回答

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的错误回调来处理。

+0

好的,我明白了。我尝试在整个程序中添加一个正常的(非rxjs相关的)try/catch块,并且错误确实进入了捕获。所以我认为这是我们在这里所能做的。 – peterc

+0

你可以看看源代码以确保发生了什么,但是如果错误不是通过可见性引发的,那么除了确保你传递了有效的密钥之外,你无能为力。 – cartant

+0

这是一个好主意(查看源代码)。是的,如果密钥没有定义或长度为零,它确实处于最高位置时会引发错误。我还发现另一种方法'instant()'(我不知道这个),它只是返回字符串 - 在doco中)它解释了如果使用这个,需要确保异步文件加载已完成。 – peterc