rxjs是否超时自动取消订阅



在nestjs上,我在observable上使用cache来减少对firestore的调用。我用observable来监听消防仓库的实时变化。在一个页面上,有对多个API端点的调用,因此我想减少在firestore上从同一文档读取的次数。我想保持可观察性,直到在一段时间(10分钟(后没有对文件的调用。

使用缓存管理器存储可观察到的内容进行了测试,它确实有效,但我想知道,当触发超时时,它是否关闭了订阅(取消订阅(。从我的测试来看,它似乎并没有取消订阅。如果是这样的话,这会导致内存泄漏,对吗?是否有取消订阅超时的选项?我尝试触发一个主题并使用takeUntil。如何确认订阅已取消订阅?

let observable: Observable<DocumentSnapshot<T>> = await this.cacheManager.get(key);

if(!observable) {
const subject = new Subject<void>();
observable = new Observable<DocumentSnapshot<T>>(obs => {
doc.onSnapshot(snapshot => obs.next(snapshot));
}).pipe(
timeout({
each: 5000,
with: () => {
this.cacheManager.del(key);
subject.next();
throw new Error('Timeout');
}
}),
shareReplay(1),
takeUntil(subject),
);
await this.cacheManager.set(key, observable);
}
return observable;

触发超时时,是否关闭订阅(取消订阅(

没有。管道内的timeout分别适用于每个排放,而不是整个流。我认为timertakeUntil会达到你的目的,比如:

const source = timer(0, 1000);
const stop = timer(5000);
source.pipe(takeUntil(stop)).subscribe(console.log);

https://stackblitz.com/edit/typescript-gpc6zk?devtoolsheight=100&file=index.ts

最新更新