You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何每隔5秒从RxJS Observable获取视频播放当前时间?

解决RxJS中每秒多次发射的Observable定时采样问题

这个问题我之前也碰到过,核心原因是你用flatMap的时候没处理好旧订阅的清理——每次interval(5000)触发时,flatMap都会新增一个对videoStreams.currentTime$的订阅,但之前的订阅并不会自动取消。随着时间推移,订阅数量越来越多,输出次数自然也就跟着递增了。

这里有两个针对性的解决方案:

方案一:用switchMap替代flatMap

switchMap的核心特性就是“切换”——每当新的Observable(这里是interval的每次发射)触发时,它会自动取消上一次订阅的Observable。这样就能保证任何时刻都只有一个currentTime$的订阅,不会出现订阅累加的问题:

const int = interval(5000); 
const subscription = int 
  .pipe(switchMap(() => videoStreams.currentTime$)) 
  .subscribe(val => console.log("TIME", val));

方案二:在flatMap中结合take(1)

如果你只想每隔5秒获取一次当前时间的快照,而不是持续监听这5秒内的所有时间变化,可以用take(1)让每次订阅只取currentTime$的最新一次发射值,然后自动取消订阅:

const int = interval(5000); 
const subscription = int 
  .pipe(flatMap(() => videoStreams.currentTime$.pipe(take(1)))) 
  .subscribe(val => console.log("TIME", val));

这个方案适合只需要定时采样单一时间值的场景,不会在5秒周期内持续输出时间变化。

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

火山引擎 最新活动