2

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

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

例如

  • 订阅topic/a
  • topic/a更改和一个更新已交付
  • 退订主题/a
  • topic/a更改且未提供更新
  • 订阅topic/a
  • topic/a更改和两个更新已交付
  • 退订主题/a
  • topic/a更改且未提供更新
  • 订阅topic/a
  • topic/a交付更改和三个更新

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

4

1 回答 1

4

当您订阅时,客户端使用订阅流来监听不同的事件。我们感兴趣的事件是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,仅订阅 2 侦听更新。

这段代码也可以使用对象文字更简洁地表达:

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');
于 2016-06-10T15:30:17.560 回答