2016-07-05 24 views
0

Ich versuche, Daten (Status) Objekt in dem Präsenzereignis zu erhalten, wie in Pubnub Documentation dokumentiert wird.Pubnub: kann Statusobjekt mit Anwesenheitsereignis nicht abrufen

Hier ist mein Code: -

// Subscribe to messages channel 
Pubnub.subscribe({ 
    channel: $scope.channel, 
    triggerEvents: ['callback','presence','message'], 
    state: { 
     username : $scope.username, 
     membershipType : $scope.membershipType, 
     memberDealsIn : $scope.memberDealsIn 
    } 
}); 

//Track online users 
Pubnub.here_now({ 
    channel : $scope.channel, 
    state: true, 
    callback : function(m){ 
     $scope.$apply(function() { 

      $scope.onlineUsers.push(m['uuids']) 
     }); 
    } 
}); 

//User's State 
Pubnub.state({ 
    channel : $scope.channel, 
    state : { 
     username : $scope.username, 
     membershipType : $scope.membershipType, 
     memberDealsIn : $scope.memberDealsIn 
    }, 
    callback : function(m){ 
     //console.log(m) 
    }, 
    error : function(m){ 
     //console.log(m) 
    } 
}); 

ich es von der getPresenceEventNameFor Methode des Pubnub nenne als: -

$scope.$on(Pubnub.getPresenceEventNameFor($scope.channel), function (ngEvent, pnEvent) { 
    console.log("pnEvent: ", pnEvent); 
} 

Hier ist meine Ausgabe: -

pnEvent: Object {action: "join", uuid: "1310974", timestamp: 1467719168, occupancy: 3} 

Wie Sie können Alles andere ist in Ordnung, aber ich kann keine Daten darin finden. Während die Documentation sagt es zu Daten haben, wie: -

{ 
"action" : "join", 
"timestamp" : 1345546797, 
"uuid" : "175c2c67-b2a9-470d-8f4b-1db94f90e39e", 
"occupancy" : 2, 
"data" : { 
    "age" : 67, 
    "full" : "RobertPlant", 
    "country" : "UK", 
    "appstate" : "foreground", 
    "latlong" : "51.5072°N,0.1275°W" 
    } 
} 

Ich habe jetzt eine Zeit lang mit dieser Sache stecken geblieben. :(

Bitte sagen Sie mir, was ich falsch hier tue. Warum ist nicht der Zustand in Gegenwart Ereignis gesetzt wird.

Vielen Dank für Ihre Hilfe.

+0

Sie sollten den Status nicht abonnieren, da er nicht immer zu den erwarteten Ergebnissen führt. Stattdessen empfiehlt es sich, zu abonnieren, und wenn der Client ein eigenes Join-Ereignis erhält, legen Sie den Status fest. Dann erhalten Sie das State-Change-Event auf zuverlässige und konsistente Weise. Lassen Sie mich wissen, ob dies Ihr Problem betrifft. Ist dies nicht der Fall, dann senden Sie am besten eine E-Mail an [PubNub Support] (http://pubnub.com/support) mit Details und einem Link zu diesem Thread, damit wir die endgültige Lösung veröffentlichen können. –

+0

Ich verstehe nicht, was Sie mit ** meinen, wenn der Client ein eigenes Join-Ereignis bekommt, setze den Status. ** Ich setze den Status, wenn das Ereignis hier ausgelöst wird. Beim ersten Mal erstelle ich die Online-Benutzerliste durch das Ereignis here_now. Und ich brauche auch State in Präsenz Event, weil ich die Online User Liste nach Präsenz Event neu generiere. Woher soll ich Daten bekommen, wenn ein Benutzer gerade online gegangen ist? Ich denke ich kann neue User vom Presence Event nur richtig erkennen? Also müssen Daten im Präsenz-Event sein. –

+0

Bereitgestellte Details im Support-Ticket. Werde hier zurück posten, wenn wir eine gute Lösung für dich gefunden haben. –

Antwort

0

Endlich. Ich konnte erkennen die Ausgabe, die dank Unterstützung pubnub. auf dem falschen Zeitpunkt der Ereignisse zurückzuführen ist. In meinem Code wurde das here_now Ereignis für den Benutzer vor der Anwesenheit Ereignis ausgelöst wird, wo sein Zustand gesetzt wird.

I Now setze den Zustand im eigenen Join-Ereignis des Benutzers und rufe das Ereignis here_now im st auf Essenswechsel-Event. Und es funktioniert.

//Presence Callback 
$scope.$on(Pubnub.getPresenceEventNameFor($scope.channel), function (ngEvent, pnEvent, envelope, channel) { 

    //Detect Join events for users 
    if (pnEvent['action'] === 'join') { 

     //Detect User's own join event and set state for the user 
     if (pnEvent['uuid'] === $scope.uuid) { 
      //User's State 
      Pubnub.state({ 
       channel : $scope.channel, 
       state : { 
        username : $scope.username, 
        membershipType : $scope.membershipType, 
        memberDealsIn : $scope.memberDealsIn 
       }, 
       callback : function(m){ 
        //console.log(m) 
       }, 
       error : function(m){ 
        //console.log(m) 
       } 
      }); 
     } 
    } 

    //Detect state change event 
    if (pnEvent['action'] === 'state-change') { 

     //Call here_now on state change of a user 
     //Track online users 
     Pubnub.here_now({ 
      channel : $scope.channel, 
      state: true, 
      callback : function(m){ 
       $scope.$apply(function() { 

        for (var userIdx in m['uuids']) { 
         var user = m['uuids'][userIdx]; 

         //Push new user to online User's list if not there 
         if (!_.find($scope.onlineUsers, {uuid: user.uuid}) && (user.uuid != $scope.uuid)){ 

          //Push only if state is not undefined 
          if (user.state.membershipType != null) { 
           $scope.onlineUsers.push({uuid: user.uuid, membership: user.state.membershipType, dealsin: user.state.memberDealsIn, username: user.state.username}); 
          } 
         } 
        } 
       }); 
      } 
     }); 
    }