具有一段代码,该代码将一些数据提取到缓存中,并使用Websocket连接使其保持同步,并使用Observable提供对数据的访问接口,我怎么知道该数据没有订阅者在某个时间点?
我想挂在unsubscribe()
调用上进行观察(并检查订户计数是否为0),但是我不确定如何实现。
现实生活中的场景是一个graphql查询(阿波罗角)和一个websocket订阅,以保持数据同步。一旦没有数据订阅者(用户导航到另一个页面,例如),可以关闭websocket连接以节省服务器资源,但是需要同时从缓存中删除数据,否则可能会丢失如果用户再次导航,则不再同步,因为不再有从服务器接收到的推送事件。 我不愿意将数据保存在过时的缓存中。
所以...我该如何看待可观察对象被破坏/所有订阅者都还没有订阅从缓存中删除数据的事件?该服务设置了一个graphql查询,并设置了订阅以侦听更改,并返回Observable,但是由于实例已通过用户代码传递,因此我不确定如何将其删除。
我不是在寻找纯网络,绕过缓存以及类似的apollo客户端设置,而是在寻找一种实际使用的方法,但要保持apollo缓存中的数据干净并保持最新状态,服务器提供了一种方法。
答案 0 :(得分:1)
如果您使用的是RxJS,则可以利用WebSocketSubject
,它提供了一些不错的选择。
例如,可以为WebSocketSubject
提供一个配置对象,其中一个有用的选项是closeObserver: NextObserver<T>
,当套接字连接关闭时,将调用其next
方法。
当WebSocketSubject
没有活动的订户时,自动关闭连接。
以下是上述想法的代码:
const connectionClosed = new Subjet();
const unsubscribe = new Subject();
const webSocket = new WebSocketSubject({
url: '',
/* ... */,
closeObserver: connectionClosed
});
connectionClosed.subscribe(() => {
// Teardown logic
// e.g clear cache
});
// Registering subscribers
webSocket.pipe(takeUntil(unsubscribe)).subscribe(...);
webSocket.pipe(takeUntil(unsubscribe)).subscribe(...);
webSocket.pipe(takeUntil(unsubscribe)).subscribe(...);
// In `ngOnDestroy`, called maybe when the user navigates to another route
unsubscribe.next();
unsubscribe.complete();