RxJS中combineLatest的subscribe回调未触发的原因是什么?
为什么你的combineLatest订阅没有输出?
嘿,我来帮你揪出问题所在!你的代码里combineLatest(sa, sz)的订阅回调完全没触发,核心原因很简单:你定义的sz这个ReplaySubject,自始至终从来没有调用过next()发射任何值。
关键原理:combineLatest的触发条件
combineLatest的工作逻辑是硬性要求的:只有当它接收的每一个源Observable都至少发出过一次值之后,它才会开始把所有源的最新值组合起来,发射给订阅者。你看你的代码,sa一直在循环里不断调用next()发射数字和字母,但sz从创建到循环结束,一次next()都没调用过——相当于它是个"沉默"的Observable,combineLatest一直在等它的第一个值,自然永远不会触发你的订阅回调。
快速修复方案
要让订阅开始输出,只需要给sz至少发射一次值就行。比如你可以在循环开始前加一行:
sz.next('init'); // 给sz一个初始值,随便什么内容都行
或者你也可以在循环里同步给sz发射值,比如和sa对应:
while(i < 10) { console.log(`i: ${i}`); sa.next(getNumber(i)); sz.next(getLetter(i)); // 这里给sz也发一个值 if(b) { sa.next(getLetter(i)); } i++; b = !b; }
这样修改后,combineLatest就能拿到两个Observable的最新值,你的console.log(s: ${a}-${z})就会正常输出啦。
再啰嗦下combineLatest的特性
怕你以后再踩类似的坑,再强调下:
- 必须所有源Observable都"说话"(至少发一次值),它才会开始工作
- 之后只要任意一个源发新值,它就会把所有源的最新值组合起来发射
- 只要有一个源全程沉默,它就全程不会有输出
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

