San*_*osh 3 observable rxjs angular
我在后端(node.js)中有一个服务,我正在通过 angular http 客户端服务订阅它,它工作正常。对于我的申请,有不止一个用户。所以其他一些用户可以更改数据库数据。所以每当数据库数据发生变化时,我都想立即订阅它们。所以所有用户都可以查看一致的数据,即与DB数据同步的数据。我在角度服务中使用 RXJS Observables。
ggr*_*nig 11
在回答之前,请注意满足您的要求说起来容易做起来难。为现有基础设施实现这一点将需要大量工作,如果您绝对需要这样做,最好在服务器端使用现有框架。
HTTP 不是执行此任务的正确协议类型。它是基于请求/响应的,并希望客户端知道它何时想要请求信息。
如果必须使用 HTTP,我只能想到两种方法。
选项 1:创建一个永远不会关闭的 HTTP 请求,即在 express 中,服务器永远不会发送res.end()
或类似的东西。这种方法也需要一个自定义的 HTTP 客户端,因为默认的 Angular HTTP 客户端希望请求在向订阅者发送任何通知之前结束。但是,如果服务器没有发送数据,浏览器可能会终止请求,因此您必须自己实现保持活动状态。
选项 2:使用“轮询” - 这意味着您不断询问您的服务器数据是否已更改。这可以在 RxJS 中实现:
interval(1000).pipe
switchMap(() => this.http.get(...)
)
Run Code Online (Sandbox Code Playgroud)
这带来了一个巨大的缺点,即您的服务器(以及您的数据库)必须处理大量请求并且您的网络流量增加(尽管只发送小包)。但是,这对您来说可能是最容易实现的,因为几乎不需要更改任何内容来支持这一点。请注意,如果您同时拥有太多用户,您的服务器和数据库会在某个时候出现故障。
浏览器仅支持如此多的协议,因此满足您需求的解决方案数量有限。一种是WebSocket。它基本上是浏览器上的 TCP 协议,但允许使用服务器将数据推送到客户端的选项的长期连接。在 RxJS 中甚至有一个类,称为WebSocketSubject
.
现在,这种方法比任何 HTTP 方法都具有更好的扩展性,但可能需要您重建后端的大部分内容。如果您想更深入地了解这一点,可以从这里开始。
到目前为止,我们只讨论了网络通信,当然您的数据库还必须支持可观察的 API(轮询方法除外)。您需要查看特定数据库系统的文档以了解它是否存在。
归档时间: |
|
查看次数: |
3849 次 |
最近记录: |