推动窗口刷新问题

时间:2013-07-26 20:23:48

标签: pusher

enter image description here enter image description here我是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

怎么办?

2 个答案:

答案 0 :(得分:1)

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

这是预期的行为。

但是,Pusher会为这些事件添加延迟,以便尝试阻止在此方案中触发事件。在你的情况下,似乎延迟时间不足以阻止这种情况发生。在您的情况下,有一个常见问题解答,提供了一些有关解决此问题的方法的信息:

答案 1 :(得分:0)

简单地解决了。

试试这个。

Pusher仪表板 - &gt;网络挂接

并添加Webhook网址&amp;事件类型为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