我的JavaScript客户端订阅了一个主题。如果我取消订阅,然后重新订阅,那么对于该主题的每一次更新,我都会收到两次发送给客户端的更新。
事实上,对于每一个订阅-取消订阅对,只要有当前订阅,当主题更改时,我就会收到一个更新。
例如
- 订阅
topic/a
- CCD_ 2改变&提供一个更新
- 取消订阅主题/a
- CCD_ 3改变&未传递更新
- 订阅
topic/a
- CCD_ 5改变&提供两个更新
- 取消订阅主题/a
- CCD_ 6改变&未传递更新
- 订阅
topic/a
- CCD_ 8改变&提供三个更新
如何每次更新只能收到一个通知?
订阅时,客户端使用订阅流来侦听不同的事件。我们感兴趣的事件是update
和unsubscribe
事件。当您订阅时,您会自动告诉流侦听update
事件。
如果您订阅了一次以上,根据您的订阅方式,您可以创建多个流,每个流都将接收update
事件。
例如,以下打开两个流:
subscription = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
subscription2 = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
而以下仅打开一个流:
subscription = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
session.unsubscribe('test/topic');
session.subscribe('test/topic');
当客户端取消订阅某个主题时,该主题的所有流不再侦听update
事件。但是,如果客户端再次订阅,则该主题的所有流将再次侦听update
事件。
取消订阅时可以关闭流,这样当您再次subscribe
时,流就不会侦听更新。这是通过侦听流上的unsubscribe
事件并从中调用流上的close()来实现的
例如:
subscription = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
subscription.on('unsubscribe', function(reason, topic) {
console.log('Unsubscribed from topic:' + topic);
subscription.close();
});
subscription2 = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
session.unsubscribe('test/topic');
session.subscribe('test/topic');
在本例中,当unsubscribe
被调用时,subscription
被关闭。当随后调用subscribe
时,只有subscription2侦听更新。
使用对象文字也可以更简洁地表达此代码:
subscription = session.subscribe('test/topic').transform(String).on({
update : function(update, topic) {
console.log('Got update for topic: ' + topic, update);
},
unsubscribe : function(reason, topic) {
console.log('Unsubscribed from : ' + topic);
subscription.close();
}
});
subscription2 = session.subscribe('test/topic').transform(String).on({
update : function(update, topic) {
console.log('Got update for topic: ' + topic, update);
}
});
session.unsubscribe('test/topic');
session.subscribe('test/topic');