2016-06-10 3 views
2

Mein JavaScript-Client abonniert ein Thema. Wenn ich mich abmelden und dann neu abonnieren, bekomme ich für jedes Update zum Thema zwei Updates an den Client.Empfangen von n Themenupdates, wobei n = 1 + Nummer des geschlossenen Abonnements für dieses Thema

Eigentlich für jedes Abonnement-Abmeldungspaar gemacht erhalten ich ein weiteres Update, wenn das Thema geändert wird, solange es ein aktuelles Abonnement gibt.

z.B.

  • abonnieren topic/a
  • topic/a ändert & ein Update
  • abmelden Thema geliefert wird/a
  • topic/a ändert & kein Update geliefert
  • abonnieren topic/a
  • topic/a ändert & zwei Updates
  • abmelden Thema geliefert werden/a
  • topic/a ändert & kein Update geliefert
  • abonnieren topic/a
  • topic/a ändert & drei Updates
geliefert werden

Wie kann ich nur eine Benachrichtigung bekommen? auf per update?

Antwort

3

Wenn Sie sich anmelden, verwendet der Client eine Subscription Stream, um auf verschiedene Ereignisse zu warten. Die Ereignisse, an denen wir interessiert sind, sind die update und unsubscribe Ereignisse. Wenn Sie abonnieren, weisen Sie den Stream automatisch an, auf die Ereignisse update zu warten.

Wenn Sie mehr als einmal abonniert haben, können Sie, je nachdem, wie Sie dies getan haben, mehrere Streams erstellen, von denen jeder update Ereignisse erhält.

Zum Beispiel öffnet sich die folgenden zwei Ströme:

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); 
    }); 

Während die erst nach einem Stream öffnet:

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'); 

Wenn der Client abmeldet zu einem Thema alle der Ströme für dieses Thema nicht mehr Höre auf update Ereignisse. Wenn der Client jedoch erneut subskribiert wird, werden alle Streams für das Thema erneut auf update Ereignisse warten.

Es ist möglich, den Stream zu schließen, wenn Sie abmelden, so dass er nicht wieder auf Updates wartet, wenn Sie wieder subscribe. Dies wird erreicht, indem auf das Ereignis unsubscribe im Stream gewartet wird und close() im Stream aufgerufen wird.

Zum Beispiel:

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'); 

In diesem Beispiel, wenn unsubscribesubscription genannt wird, ist geschlossen. Wenn subscribe anschließend aufgerufen wird, wartet nur Abonnement2 auf Updates.

Dieser Code kann auch kurz und bündig mit Objektliterale ausgedrückt werden:

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');