You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJS中如何避免订阅与上次发射值相同的组合结果

问题

如何避免订阅与上次发射值相同的组合结果

现有代码如下:

this.first$.next('one');
this.second$.next(false);
    
combine$ = combineLatest([this.first$, this.second$])
  .pipe(map(([first, second]) => {
    //do something if one of the values is different
  }))

需求:仅当其中一个值与上次发射的值不同时才进行订阅。

示例

场景一

  • 第一次发射:
    this.first$.next('one');
    this.second$.next(false); -> 订阅首次发射的值
  • 第二次发射:
    this.first$.next('one');
    this.second$.next(false); -> 不订阅此次发射的值

场景二

  • 第一次发射:
    this.first$.next('one');
    this.second$.next(true); -> 订阅首次发射的值
  • 第二次发射:
    this.first$.next('one');
    this.second$.next(false); -> 订阅此次发射的值

解决方案

使用RxJS的distinctUntilChanged操作符即可实现需求,不过需要自定义比较函数来处理数组类型的组合值(默认的引用比较对数组无效)。

修改后的代码如下:

import { distinctUntilChanged } from 'rxjs/operators';

// 自定义比较函数:判断两次组合结果是否完全一致
const isCombinedEqual = (prev: [string, boolean], curr: [string, boolean]) => {
  return prev[0] === curr[0] && prev[1] === curr[1];
};

combine$ = combineLatest([this.first$, this.second$])
  .pipe(
    distinctUntilChanged(isCombinedEqual),
    map(([first, second]) => {
      // 此处逻辑仅在组合值变化时执行
      // do something
    })
  );

说明

  • distinctUntilChanged会拦截与上一次发射值相同的结果,只有当新值和旧值不同时,才会将值传递到后续操作符。
  • 由于combineLatest发射的是数组(引用类型),必须自定义比较函数,逐项对比数组内的元素是否完全相等,才能正确判断组合结果是否重复。

内容的提问来源于stack exchange,提问作者Mat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:12:22