2017-04-20 89 views
1

我打电话给forkJoin中的2个服务,第二个服务可能会失败,但如果第二个服务失败,我想stream继续。角度2:rxjs forkJoin http错误继续流

我有什么至今:

Observable.forkJoin([ 
    this.http.get('/service1'), 
    this.http.get('/service2').catch(error => Observable.empty()) 
]) 
    .do(([result1, result2]: any[]) => { 
     //When service2 fails, I never get in here with .empty() 

    }) 

Observable.of(undefined)Observable.of(error)作品。但是,我的印象是,仅从catch返回empty Observable会使呼叫失败,流将继续?

如何确保在service2失败时流继续运行?

回答

3

Observable.empty()只需调用complete方法observer对象,所以它什么也不做。 这是怎么forkJoin工作:

当完成所有观测发射从每个最后一个值。

Observable.empty()没有任何最后的值,所以forkJoin不知道如何emit the last value。如果您Observable.of(undefined)这意味着,您调用next方法与undefined然后complete方法将调用。所以最后的值是undefined

如何确保在service2失败时流继续运行?

您可以添加错误处理程序和完成处理程序的测试目的。

演示在这里:http://jsbin.com/babirakiyi/1/edit?js,console

感谢@Yury Tarabanko测试用例:

https://github.com/ReactiveX/rxjs/blob/524259a9bf2154824ddced89efc71c2e4149b2a9/spec/observables/forkJoin-spec.ts#L165-L174

+1

+1甚至有测试用例检查'如果有源是空的HTTPS forkJoin'不会发出:// github上。 COM/ReactiveX/rxjs /斑点/主/规格/观测/ forkJoin-spec.ts#L165 –