我有一个websocket连接,它使用ReplaySubect生成内部消息事件。我处理这些事件并为某些消息添加延迟。在内部我使用了publish()。refCount()两次,一次在内部ReplaySubject上,再次在已发布的输出流上。
内部主题是否同时调用了'publish'和'refCount'?我使用'发布'是因为我有多个订阅者,但我不完全确定何时使用'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") {
// ...
}
});
答案 0 :(得分:2)
发布和refCounting基本上是shareReplay
在RxJS4中的作用。老实说,你应该让你的observable“温暖”,然后使用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);
确保查看Observable的工作方式:创建observable后,通常每个订阅者都会调用订阅(冷),但在这种情况下,您可能需要一个热可观察对象,以便您有多个订阅者共享订阅。有关详情,请参阅Andre's video here和RxJS docs on creating observables。
此外,与类一样有用,看起来在这种情况下你只需要makeWebsocketObservable(WebsocketConfig): Observable<WebsocketEvent>