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

Receiving n topic updates, where n = 1+number of closed subscription to that topic

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

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

例如

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

当您订阅时,客户端使用 Subscription Stream 来监听不同的事件。我们感兴趣的事件是 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');