我正在使用 rxjs 5.5.6。
我创建了这段代码来展示该行为:
Observable.of(1, 2)
.do(a => {
console.log(a);
let d:string = null;
let r = d.length; // it raises an null exception
})
.catch(() => {
console.log("error catched"); //exception is capture here
return Observable.never();
})
.subscribe();
我期望输出是:
1
error catched
2
error catched
但是,输出是:
1
error catched
这意味着,尽管有Observable.never()
返回于.catch(...)
方法链。
有任何想法吗?
真实案例
this.subs = Observable
.merge(this.$searchQuery, this.$lazyQuery)
.do(() => this.loadingPage())
.map(filter => this.buildURL(user, app, filter))
.switchMap(url => this.service.getItemsFromService(url))
.map(response => this.buildPage(response))
.do(page => this.loadedPage(page))
.catch(() => {
this.loadedPage(pojo.Page.EMPTY);
return Observable.never();
})
.takeUntil(this.$unsubscribe)
.subscribe();
你得到输出
1
error catched
因为第一个值会引发错误tap
这是通过传播onError
停止序列的通道。和catch
您捕获此错误并继续执行下一个序列(never
),但是第一个序列(of(1,2)
)仍处于停止状态。所以之后1
抛出错误2
从未被处理过tap
.
回来后never
in catch
不会发出任何值,并且 Observable 永远不会完成。如果你在里面添加日志subscribe
为了next
, error
and complete
回调你会看到它们永远不会被执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)