2

有一段代码可以将一些数据提取到缓存中,并使用 websocket 连接使其保持同步,并使用 Observable 提供对数据的访问接口,我怎么知道在某一点上没有所述数据的订阅者及时?

我想unsubscribe()挂上 observable 的调用(并检查订阅者计数是否为 0),但我不确定如何实现。

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

那么......我如何才能挂钩可观察对象被销毁/所有订阅者都取消订阅以从缓存中删除数据的事件?该服务设置了一个graphql查询并设置了订阅以侦听更改,返回Observable,但我不确定如何将其删除,因为该实例已在用户代码上传递。

我不是在寻找仅网络、绕过缓存和类似的 apollo 客户端设置,我正在寻找一种实际使用的方法,但要保持 apollo 缓存中的数据干净和最新,作为服务器提供了一种方法来做到这一点。

4

1 回答 1

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();
于 2020-05-27T20:42:30.633 回答