在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
分别适用于每个排放,而不是整个流。我认为timer
和takeUntil
会达到你的目的,比如:
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