Javascript 操作RxJS流并发布可观察结果的正确方法是什么?
我有一个websocket连接,它正在使用ReplaySubject生成内部消息事件。我处理这些事件并为某些消息添加延迟。在内部,我使用publish().refCount()两次,一次在内部ReplaySubject上,另一次在发布的输出流上 内部主题是否应该同时调用“publish”和“refCount”?我使用“publish”是因为我有多个订阅者,但我不完全确定何时使用“refCount” 只处理内部主体可以吗?这会清理掉其他一切吗 订阅“eventStream”的用户应获得最新版本,但连接不应等待任何订阅者 示例代码:Javascript 操作RxJS流并发布可观察结果的正确方法是什么?,javascript,rxjs,Javascript,Rxjs,我有一个websocket连接,它正在使用ReplaySubject生成内部消息事件。我处理这些事件并为某些消息添加延迟。在内部,我使用publish().refCount()两次,一次在内部ReplaySubject上,另一次在发布的输出流上 内部主题是否应该同时调用“publish”和“refCount”?我使用“publish”是因为我有多个订阅者,但我不完全确定何时使用“refCount” 只处理内部主体可以吗?这会清理掉其他一切吗 订阅“eventStream”的用户应获得最新版本,但
function Connection(...) {
var messageSubject = new Rx.ReplaySubject(1);
var messageStream = messageSubject.publish().refCount();
// please ignore that we're not using rxdom's websocket.
var ws = new WebSocket(...);
ws.onmessage = function(messageEvent) {
var message = JSON.parse(messageEvent.data);
messageSubject.onNext(message);
}
ws.onclose = function(closeEvent) {
messageSubject.dispose(); // is this all I need to dispose?
}
var immediateRevisions = messageStream
.filter((e) => e[0] === "immediate")
.map((e) => ["revision", e[1]]);
var delayedRevisions = messageStream
.filter((e) => e[0] === "delayed")
.map((e) => ["revision", e[1]]).delay(1000);
var eventStream = Rx.Observable.merge(immediateRevisions, delayedRevisions).publish().refCount();
Object.defineProperties(this, {
"eventStream": { get: function() { return eventStream; }},
});
}
// using the eventStream
var cxn = new Connection(...)
cxn.eventStream.subscribe((e) => {
if (e[0] === "revision") {
// ...
}
});
发布和引用计数基本上就是RxJS4中的
shareReplay
所做的。老实说,如果您真的想保证最后一条消息被推送到新的订阅者手中,那么您应该让您的可观察对象“温暖”,然后使用ReplaySubject作为订阅者,即使订阅者数量低于1。e、 g:
const wsStream = Observable.create(observer => {
ws.onmessage = message => observer.next(message);
ws.onclose = () => observer.complete();
});
const latestWsMessages = new ReplaySubject(1);
wsStream.subscribe(latestWsMessages);
确保您查看了可观察对象的工作方式:在创建了可观察对象之后,通常每个订阅者都会调用订阅(cold),但在这种情况下,您可能需要一个热可观察对象,以便有多个订阅者共享一个订阅。有关更多信息,请参阅和
此外,类尽可能有用,在本例中,看起来您只需要一个函数
makeWebsocketObservable(WebsocketConfig):Observable
,这是一个很好的答案,但我建议扩展“shareReplay”的功能(did?),并可能扩展到dispose。我基本上需要一些关于加入和共享流的指导。我会查看你的链接!谢谢