接收n个主题更新,其中n=1+该主题的已关闭订阅数

  • 本文关键字:更新 其中 接收 push-diffusion
  • 更新时间 :
  • 英文 :


我的JavaScript客户端订阅了一个主题。如果我取消订阅,然后重新订阅,那么对于该主题的每一次更新,我都会收到两次发送给客户端的更新。

事实上,对于每一个订阅-取消订阅对,只要有当前订阅,当主题更改时,我就会收到一个更新。

例如

  • 订阅topic/a
  • CCD_ 2改变&提供一个更新
  • 取消订阅主题/a
  • CCD_ 3改变&未传递更新
  • 订阅topic/a
  • CCD_ 5改变&提供两个更新
  • 取消订阅主题/a
  • CCD_ 6改变&未传递更新
  • 订阅topic/a
  • CCD_ 8改变&提供三个更新

如何每次更新只能收到一个通知?

订阅时,客户端使用订阅流来侦听不同的事件。我们感兴趣的事件是updateunsubscribe事件。当您订阅时,您会自动告诉流侦听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');

最新更新