如何用RxJS仅在指定时间间隔(3秒、6秒)触发函数?
解决方案
根据你的需求,要在3秒、6秒等特定时间点调用函数,并且输出类似[1], [2], [3]的格式,推荐以下几种RxJS实现方式:
方式一:按固定间隔(每3秒)触发,持续执行
适合需要每隔3秒触发一次函数的场景,输出符合你期望的单元素数组:
summarize(): void { const responseInterval = interval(1000); const triggerObservable = responseInterval.pipe( // 筛选第3秒、第6秒、第9秒...对应的发射值(x从0开始计数,第3秒对应x=2,第6秒对应x=5) filter(x => (x + 1) % 3 === 0), // 转换为[1], [2], [3]的格式 map(x => [(x + 1) / 3]) ); triggerObservable.subscribe(intervalValue => { console.log('intervalValue', intervalValue); // 在这里调用你的目标函数 // yourTargetFunction(intervalValue); }); }
输出结果:
intervalValue [1] // 第3秒触发 intervalValue [2] // 第6秒触发 intervalValue [3] // 第9秒触发 ...
方式二:仅在指定时间点(3秒、6秒)各触发一次
如果只需要在第3秒和第6秒触发两次,之后停止执行:
summarize(): void { // 3秒后首次发射,之后每隔3秒发射一次,仅取前两次 const triggerObservable = timer(3000, 3000).pipe( take(2), map(x => [x + 1]) ); triggerObservable.subscribe(intervalValue => { console.log('intervalValue', intervalValue); // 调用你的目标函数 }); }
输出结果:
intervalValue [1] // 第3秒触发 intervalValue [2] // 第6秒触发
原代码问题说明
你之前使用bufferTime(1000)是每秒收集一次interval的发射值,窗口时间与需求不匹配,所以输出不符合预期。如果是想每3秒收集一次前3秒内的所有值,只需将bufferTime(1000)改为bufferTime(3000),但输出会是[0,1,2](3秒时)、[3,4,5](6秒时)这类数组,和你期望的单元素数组不同。
内容的提问来源于stack exchange,提问作者Brandon Taylor
相关产品推荐
相关产品推荐

