发布于 1年前

Observable不会触发onComplete

<figure class="image"></figure>最近在使用Observable的时候,遇到一个特别有意思的问题,那就是将两个Observable顺序合并,然后订阅的时候,发现这两个Observable并不能顺序执行,而是只有一个Observable能够发出值。

首先看看我的代码吧:

let userProfile$ = this.userCenterService.getUserProfile();
let userAccount$ = this.userCenterService.getUserAccount();
let concatUser$ = concat(userProfile$,userAccount$);
concatUser$.subscribe(v=>{
    console.log('concatUser:',v);
});

需要注意的一点就是:

1、userProfile$是一个BehaviorSubject调用asObservable()返回的一个Observable对象,userAccount$同样如此。

2、它们实际上是subject调用asObservable()返回的对象。

3、使用了concat操作符,按照道理来说应该是顺序打印出这两个对象的值才对。

实际情况就是

可以看出,虽然这个值打印了两次,实际上只是打印了userProfile$的值,而没有打印出userAccount$的值。心里顿时疑惑不解?

后来仔细想想了想concat的作用,猜测应该是第一个Observable没有完成。concat的作用请参考链接。

concat的作用是必须第一个Observable完成之后,才会订阅后面的Observable执行。

在结合这个链接(Why subscribe on BehaviourSubject asObservable never fires onComplete?)的解释:

大概的意思就是说:Subject返回的Observable不会自动完成,比如手动调用subject.complete()

我们可以反过来思考一下,subject的作用主要是用于广播给多个观察者,如果它自动完成了,那么后面发送的值肯定就无法发出来啦。

因此,这个问题的解决方案就是:如果你真的需要完成这个Observable,那么就手动找到这个Observable对应的subject,然后手动调用complete();另外也可以用其他的操作符,比如merge或者zip等等

©2020 edoou.com   京ICP备16001874号-3