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

Rxjs:如何配置bufferTime仅在有新值到达时触发发射?

RxJS:解决bufferTime定时发射空数组的问题

你当前使用bufferTime(100)处理窗口resize事件时,即使没有新的resize事件触发,bufferTime仍会每隔100ms发射一个空数组。你需要实现的效果是:仅当有新值进入时,才在100ms后一次性发射这段时间内收集的所有值;无新值时不向订阅者推送数据。

解决方案

方案一:适配连续触发场景(推荐用于resize)

使用buffer结合debounceTime,会在最后一次值触发后的100ms,一次性发射这段时间内收集的所有值,完全匹配你的需求:

this.resizeSubject.pipe(
  // 以debounceTime的触发作为buffer的结束信号:最后一次值后等待100ms,无新值则发射缓冲数据
  buffer(this.resizeSubject.pipe(debounceTime(100)))
).subscribe((data) => {
  console.log(data);
});

方案二:定时批量检查

如果需要严格按照“每100ms检查一次,有值则发射该时间段内的所有值,无值则跳过”,可以用bufferTime配合filter过滤空数组:

this.resizeSubject.pipe(
  bufferTime(100),
  // 过滤空数组,仅发射包含有效数据的缓冲结果
  filter(buffer => buffer.length > 0)
).subscribe((data) => {
  console.log(data);
});

原始事件触发代码

你的resize事件处理逻辑:

@HostListener('window:resize', ['$event'])
onResize(event) {
  let innerWidth = event.target.innerWidth;
  this.resizeSubject.next(innerWidth);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:30:43