如何每隔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




