RxJS是否存在内置Observable或方法,实现完成后发送收集值的功能?
回答你的RxJS问题
嘿,很高兴你提出这个问题!咱们分两部分来解答:
1. 前一个Observable完成后触发next的内置能力
RxJS里确实有不少内置工具能实现“前一个Observable完成后再触发后续逻辑/发出值”的需求,最常用的有这些:
concat:它会按顺序订阅多个Observable,只有当前面的Observable完全完成(调用complete)后,才会订阅下一个Observable并开始发出它的值。比如:import { concat, of } from 'rxjs'; const obs1 = of(1, 2, 3); const obs2 = of('a', 'b'); concat(obs1, obs2).subscribe(val => console.log(val)); // 输出:1, 2, 3, 'a', 'b'endWith:如果只是想在源Observable完成后,额外发出一个固定值,可以用这个操作符。比如:import { of } from 'rxjs'; import { endWith } from 'rxjs/operators'; of(1,2,3).pipe(endWith('done')).subscribe(val => console.log(val)); // 输出:1,2,3,'done'
2. 替代你自定义whenCompleted的内置方法
你写的whenCompleted方法,核心逻辑是收集源Observable所有发出的值,在源完成时把这个数组作为单个next值发出——这个功能RxJS已经有现成的操作符了,就是**toArray()**!
它的行为和你的自定义方法完全一致:
- 订阅源Observable,收集所有
next发射的值到数组 - 当源Observable调用
complete时,把收集到的数组作为单个值发射出去 - 之后立即调用自身的
complete
用toArray()替代你的自定义方法的话,代码会简化很多:
import { of } from 'rxjs'; import { toArray } from 'rxjs/operators'; // 原来的用法:source$.whenCompleted().subscribe(arr => console.log(arr)); // 现在可以改成: of(1,2,3).pipe(toArray()).subscribe(arr => console.log(arr)); // 输出:[1,2,3]
完全不需要自己去扩展Observable原型啦,toArray()是RxJS内置的操作符,已经覆盖了你这个场景的所有需求。
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

