0

在此处输入图像描述在此处输入图像描述我对 pusher.com 很陌生:我正在尝试建立一个在线频道聊天。

这是我的代码:

var PresenceChannel = pusher.subscribe('presence-test_channel');

PresenceChannel.bind('pusher:subscription_succeeded', function(members){
  $("#chatMembers").empty();

  members.each(function(member) {
     $("#chatMembers").prepend("<li id='"+member.info.employee_id+"'>"+member.info.customer_id+"</li>");
  });   
});

PresenceChannel.bind('pusher:member_added',function(member){
     $("#chatMembers").prepend("<li id='"+member.info.employee_id+"'>"+member.info.customer_id+"</li>");
});

PresenceChannel.bind('pusher:member_removed',function(member){
    $("li#"+member.info.employee_id).remove();
});

它按预期工作。

但我有一个问题:

当我刷新打开的浏览器窗口之一时,会触发以下事件:

PresenceChannel.bind('pusher:member_added',function(member){...

紧接着,

PresenceChannel.bind('pusher:member_removed',function(member){...

被开除。因此,在刷新一个窗口后,用户从我的列表中删除,1 秒后,用户再次被添加到列表中......

1) 重新加载 1 个浏览器窗口

2)另一个窗口触发'pusher:member_removed':用户从列表中删除

3)另一个窗口触发'pusher:member_added':用户添加到列表agein

该怎么办 ?

4

2 回答 2

1

第二个窗口收到一个pusher:member_removed,因为第一个窗口已经卸载并且用户因此离开了出席频道。当第二个窗口重新加载并且用户重新订阅出席频道时,pusher:member_added就会触发。

这是预期的行为。

但是,Pusher 确实为这些事件添加了延迟,以尝试并停止在这种情况下触发的事件。在您的情况下,延迟似乎不足以阻止这种情况的发生。在您的情况下,有一个常见问题解答提供了一些关于您可以采取哪些措施来解决此问题的信息:

于 2013-07-28T09:06:37.320 回答
0

它很简单地解决了。

尝试这个。

Pusher 仪表板 -> Webhook

并将 Webhook url 和事件类型添加到 Presense。

$app_secret = 'YOUR PUSHER SECRET KEY';

$app_key = $request->headers->get('X-Pusher-Key');
$webhook_signature = $request->headers->get('X-Pusher-Signature');

$body = file_get_contents('php://input');

$expected_signature = hash_hmac( 'sha256', $body, $app_secret, false );

if($webhook_signature == $expected_signature) {
    // decode as associative array
    $payload = json_decode( $body, true );
    foreach($payload['events'] as &$event) {
      // do something with the event
        if ($event['name'] == 'member_added') {
            // do process user joind & trigger message
            $this->setAddMember($event);
        } elseif ($event['name'] == 'member_removed') {
            // do process user out & trigger message
            $this->setRemoveMember($event);
        }
    }

    header("Status: 200 OK");
}
else {
    header("Status: 401 Not authenticated");
}

更多详细信息请参阅文档。

https://pusher.com/docs/webhooks

于 2016-06-16T03:02:14.020 回答