RxJS Observable订阅多值时如何单独获取指定值
RxJS 4.1.0 实现独立获取流中指定推送值的方法
针对示例中固定顺序推送的Observable流,不需要修改原流的定义逻辑,通过内置操作符或简单的状态计数即可实现单值独立获取,常见实现方案如下:
仅需获取目标值、不接收其他流值的场景
- RxJS 4 内置提供
elementAt操作符,逻辑为:订阅上游流,定位到指定索引位置的推送值后立即向外推送该值,随后自动终止流订阅,不会消费后续的其他推送值 - 流的推送值索引从0开始计数,要获取第二个推送值,对应索引为1
- 可直接运行的实现代码:
const observable = Rx.Observable.create( observer => { observer.next( 'hello' ) observer.next( 'world' ) }) // 筛选索引为1的推送值,即第二个抛出的元素 observable .elementAt(1) .subscribe(val => console.log(val)) // 控制台仅输出 'world'
- 边界说明:如果指定索引没有对应的推送值(例如流总共只推送1个值,却尝试取索引为2的元素),操作符会直接触发流完成逻辑,不会向外推送任何值
需正常接收所有流值、仅对指定顺序值做独立处理的场景
- 如果不需要中断流的接收,只是想在订阅过程中单独拦截指定顺序位置的值执行额外逻辑,可以手动维护接收到值的计数器,在计数匹配到目标位置时执行独立处理即可
- 可直接运行的实现代码:
const observable = Rx.Observable.create( observer => { observer.next( 'hello' ) observer.next( 'world' ) }) let receiveCount = 0; observable.subscribe(val => { receiveCount++; // 计数匹配到第二个值时,执行独立获取逻辑 if (receiveCount === 2) { console.log('独立捕获的第二个值:', val) } // 原有逻辑正常处理所有推送值 console.log('常规处理所有流值:', val) })
- 运行后控制台输出顺序:
常规处理所有流值: hello 常规处理所有流值: world 独立捕获的第二个值: world
内容的提问来源于stack exchange,提问作者Srini K
相关产品推荐
相关产品推荐

