未知数量Observable数组任意项返回true时整体返回true的实现方法
解决方案
核心思路是使用 RxJS 的 combineLatest 操作符处理任意数量的 Observable 输入,配合数组原生的 some 方法判断是否存在真值即可,不需要预先知道 Observable 数量。
完整实现代码
import { combineLatest, Observable, of } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; class Foo { // 注意:返回值从void调整为Observable<boolean>,对外暴露计算后的布尔结果 show$(multipleObservables$: Observable<boolean>[]): Observable<boolean> { // 兼容空数组的边界场景,无输入时默认返回false if (multipleObservables$.length === 0) { return of(false); } return combineLatest(multipleObservables$).pipe( // 只要任意一个Observable的最新值为true,整体就返回true map((latestValues) => latestValues.some(Boolean)) ); } }
调用示例
const observableOne$ = of(false); const observableTwo$ = of(true); const observableThree$ = of(false); const observables$ = [observableOne$, observableTwo$, observableThree$]; const foo = new Foo(); // 订阅后打印结果为 true foo.show$(observables$).subscribe(result => console.log(result));
补充说明
combineLatest会等待所有传入的 Observable 都至少触发一次值之后,才会第一次输出计算结果。如果你需要在任意 Observable 未触发时就有初始值,可以给每个 Observable 追加默认值:const processedObservables = multipleObservables$.map(obs$ => obs$.pipe(startWith(false))); return combineLatest(processedObservables).pipe( map(latestValues => latestValues.some(Boolean)) )- 如果需要只要有一个 Observable 触发 true 就立刻结束订阅,可以在 pipe 中追加
first(Boolean)操作符,拿到第一个真值后就自动终止,减少性能消耗。
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

