2016-07-05 43 views
0

我正在嘗試獲取存在事件中的數據(狀態)對象,如Pubnub Documentation中所述。Pubnub:無法獲得存在事件的狀態對象

這裏是我的代碼: -

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

我從Pubnub的getPresenceEventNameFor方法調用它: -

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

這裏是我的輸出: -

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

,你可以看到其他一切都很好,但我無法獲取數據。 儘管Documentation說,它應該有太多的數據,如: -

{ 
"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" 
    } 
} 

我一直堅持這個東西有一段時間了。 :(

請告訴我,我在這裏做錯了,爲什麼沒有在狀態下的呈現事件的設置。

感謝您的幫助。

+0

您不應該訂閱狀態,因爲它並不總是在所有情況下都會產生預期的結果。相反,最佳做法是訂閱,然後在客戶端獲得自己的加入事件時設置狀態。然後,您將以可靠,一致的方式獲得狀態更改事件。讓我知道,如果這個地址你問。如果沒有,那麼可能最好將電子郵件提交給[PubNub支持](http://pubnub.com/support)並提供詳細信息並鏈接到此主題,以便我們可以回傳最終解決方案。 –

+0

我不明白你的意思是什麼「當客戶端得到它自己的連接事件,設置狀態」。**我設置了當this_now事件被觸發時的狀態。第一次通過here_now事件生成在線用戶列表。我也需要狀態,因爲我通過在場事件重新生成在線用戶列表。如果用戶剛上線,我應該從哪裏獲得數據(狀態)?我認爲我可以從存在事件檢測新用戶只是正確的?所以數據需要在場。 –

+0

在支持票上提供詳細信息。當我們爲您找到一個很好的解決方案時,我們會回到這裏。 –

回答

0

最後,我已經能夠檢測這個問題,感謝pubnub支持。 這是由於事件的時機不對。 在我的代碼,目前正在對其中的狀態被設定用戶呈現事件之前觸發here_now事件。

現在我在用戶自己的加入事件中設置狀態並在st中調用here_now事件改變事件。它的工作。

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