RxJS:Observable.never() 保持订阅状态

2024-01-03

我正在使用 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(使用前将#替换为@)

RxJS:Observable.never() 保持订阅状态 的相关文章

随机推荐