如何动态处理RxJS forkJoin返回数组的逻辑与运算?
解决方案
直接利用数组的every()方法就能动态实现所有布尔值的逻辑与运算,不需要依赖固定数量的解构参数。修正后的代码如下:
import { forkJoin, Observable, of } from 'rxjs'; import { map } from 'rxjs/operators'; // ... canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { private totalKeys: Observable<boolean>[] = []; // 建议用TS原始类型小写boolean,而非包装类型Boolean // 这里是填充totalKeys的逻辑 // 可选:处理空数组的边界情况 if (this.totalKeys.length === 0) { return of(false); // 可根据业务需求改为of(true) } return forkJoin(this.totalKeys).pipe( // every()会检查所有元素是否为true,全满足才返回true,等价于逻辑与 map(results => results.every(isValid => isValid)) ); };
关键说明
forkJoin会等待所有totalKeys中的Observable完成,然后返回一个包含所有结果的布尔数组,不管数组长度是多少。Array.prototype.every()的特性正好匹配逻辑与:只要有一个元素为false,整个表达式就返回false;只有所有元素都是true时,才返回true。- 空数组的额外判断是因为JS中空数组调用
every()默认返回true,如果你的业务场景中空数组应该返回false,就需要提前处理这个边界情况。
内容的提问来源于stack exchange,提问作者Mitul Panchal
相关产品推荐
相关产品推荐

