我的JavaScript客户端订阅了一个主题。如果我取消订阅然后重新订阅,那么对于该主题的每次更新,我都会向客户端发送两个更新。
实际上,对于每个订阅 - 取消订阅对,只要有当前订阅,我在主题发生更改时会再收到一次更新。
e.g。
topic/a
topic/a
更改& 一次更新topic/a
更改&没有提供更新topic/a
topic/a
更改& 两次更新topic/a
更改&没有提供更新topic/a
topic/a
更改& 三次更新如何每次更新只收到一个通知?
答案 0 :(得分:3)
订阅时,客户端使用Subscription Stream来监听不同的事件。我们感兴趣的事件是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');