RxJS中按合规状态汇总资源计数:是否有更简洁实现方式?
优化RxJS合规状态资源计数汇总的写法
你的代码逻辑可行,但可以通过减少冗余请求、扁平化管道结构让代码更简洁易读,以下是两种优化方案:
方案一:针对原模拟场景(无参数的计数请求)
原代码中每个合规类型都重复请求了所有规则的计数,这里先一次性计算所有规则的总计数,再复用该值生成最终结果:
const { combineLatest, of, map, switchMap } = require('rxjs'); const rules$ = of(['one', 'two', 'three']); // 实际来自HTTP请求 const complianceTypes = [ 'COMPLIANT', 'NON_COMPLIANT', 'NOT_APPLICABLE', 'INSUFFICIENT_DATA', ]; const getCountsForRule$ = () => of(1); // 实际来自HTTP请求 rules$ .pipe( // 一次性获取所有规则的计数并求和 switchMap(rules => combineLatest(rules.map(getCountsForRule$)).pipe( map(totalPerRule => totalPerRule.reduce((sum, count) => sum + count, 0)) )), // 基于总计数快速生成每个合规类型的统计对象 map(totalCount => complianceTypes.reduce( (acc, type) => ({ ...acc, [type]: totalCount }), {} )) ) .subscribe(res => console.log('Got result', { res }));
方案二:针对实际场景(计数请求需传入规则和合规类型)
如果getCountsForRule$实际需要接收rule和complianceType参数,可通过简化对象合并逻辑优化:
const { combineLatest, of, map, switchMap } = require('rxjs'); const rules$ = of(['one', 'two', 'three']); const complianceTypes = [ 'COMPLIANT', 'NON_COMPLIANT', 'NOT_APPLICABLE', 'INSUFFICIENT_DATA', ]; // 实际场景中接收规则和合规类型参数 const getCountsForRule$ = (rule, complianceType) => of(1); rules$ .pipe( switchMap(rules => combineLatest( complianceTypes.map(type => combineLatest(rules.map(rule => getCountsForRule$(rule, type))).pipe( map(counts => ({ [type]: counts.reduce((sum, c) => sum + c, 0) })) ) ) )), // 用Object.assign代替reduce合并结果对象,更简洁 map(results => Object.assign({}, ...results)) ) .subscribe(res => console.log('Got result', { res }));
核心优化点
- 减少冗余请求:方案一避免了对同一规则计数的重复请求,降低实际HTTP场景下的资源消耗
- 扁平化管道:简化嵌套的
combineLatest结构,让逻辑更线性,可读性更强 - 简化对象合并:用
Object.assign或展开语法替代多层reduce,减少代码复杂度
内容的提问来源于stack exchange,提问作者Aurelia Peters
相关产品推荐
相关产品推荐

