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

时间:2016-06-10 14:14:29

标签: push-diffusion

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

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

e.g。

  • 订阅topic/a
  • topic/a更改& 一次更新
  • 取消订阅主题/ a
  • topic/a更改&没有提供更新
  • 订阅topic/a
  • topic/a更改& 两次更新
  • 取消订阅主题/ a
  • topic/a更改&没有提供更新
  • 订阅topic/a
  • topic/a更改& 三次更新

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

1 个答案:

答案 0 :(得分:3)

订阅时,客户端使用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');

在此示例中,调用unsubscribesubscription已关闭。随后调用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');