RxJS取消订阅钩子

时间:2020-05-27 16:16:09

标签: angular rxjs graphql rxjs-observables apollo-angular

具有一段代码,该代码将一些数据提取到缓存中,并使用Websocket连接使其保持同步,并使用Observable提供对数据的访问接口,我怎么知道该数据没有订阅者在某个时间点?

我想挂在unsubscribe()调用上进行观察(并检查订户计数是否为0),但是我不确定如何实现。

现实生活中的场景是一个graphql查询(阿波罗角)和一个websocket订阅,以保持数据同步。一旦没有数据订阅者(用户导航到另一个页面,例如),可以关闭websocket连接以节省服务器资源,但是需要同时从缓存中删除数据,否则可能会丢失如果用户再次导航,则不再同步,因为不再有从服务器接收到的推送事件。 我不愿意将数据保存在过时的缓存中。

所以...我该如何看待可观察对象被破坏/所有订阅者都还没有订阅从缓存中删除数据的事件?该服务设置了一个graphql查询,并设置了订阅以侦听更改,并返回Observable,但是由于实例已通过用户代码传递,因此我不确定如何将其删除。

我不是在寻找纯网络,绕过缓存以及类似的apollo客户端设置,而是在寻找一种实际使用的方法,但要保持apollo缓存中的数据干净并保持最新状态,服务器提供了一种方法。

1 个答案:

答案 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();