2013-07-24 80 views
1

我有一個小片段引發「現有訂閱頻道」異常,即使我只調用一次訂閱方法。「現有訂閱頻道」,而只訂閱一次

這可以通過移動「state_change」處理程序外的訂閱請求來避免,但我想知道什麼可能會導致這種情況?也許Pusher庫中存在一個錯誤?

<!doctype html> 
<html> 
<body> 
    <h1>Pusher subscribe testcase</h1> 
    <p>Tip: check your console</p> 
    <script src="https://d3dy5gmtp8yhk7.cloudfront.net/2.1/pusher.min.js"></script> 
    <script> 
     var pusher, channel; 
     pusher = new Pusher('xxxxxxxxxxxxxxxxx'); 
     pusher.connection.bind('state_change', function(change){ 
      if(change.current === 'connected'){ 
       console.log('connected'); 
       channel = pusher.subscribe('test-channel'); 
       channel.bind('pusher:subscription_succeeded', function() { 
        console.log('subscribed'); 
       }); 
      } 
     }) 
    </script> 
</body> 
</html> 

這導致:

connected 
subscribed 
Pusher : Error : {"type":"WebSocketError","error":{"type":"PusherError","data":{"code":null,"message":"Existing subscription to channel test-channel"}}} 

回答

3

雖然它看起來像在圖書館中的錯誤(做報告吧!),你不需要綁定到state_change事件,以訂閱頻道。

如果你看一下代碼,訂閱事件pusher.js

prototype.subscribe = function(channel_name) { 
    var self = this; 
    var channel = this.channels.add(channel_name, this); 

    if (this.connection.state === 'connected') { 
    channel.authorize(this.connection.socket_id, function(err, data) { 
     if (err) { 
     channel.handleEvent('pusher:subscription_error', data); 
     } else { 
     self.send_event('pusher:subscribe', { 
      channel: channel_name, 
      auth: data.auth, 
      channel_data: data.channel_data 
     }); 
     } 
    }); 
    } 
    return channel; 
}; 

,你會看到,它會首先通過channels.add方法,它看起來像這樣的頻道添加到頻道的內部列表:

prototype.add = function(name, pusher) { 
    if (!this.channels[name]) { 
    this.channels[name] = createChannel(name, pusher); 
    } 
    return this.channels[name]; 
}; 

它只會添加頻道,以防您以前沒有訂閱。

因此,如果您要訂閱之前的頻道,則建立連接時,Pusher客戶端將只將頻道添加到列表中。一旦客戶端建立連接後,它會再次調用subscribe方法通過subscribeAll方法在其列表中的每個聲道:

this.connection.bind('connected', function() { 
    self.subscribeAll(); 
}); 

而且看到,在這一點this.connection.stateconnected,它將連接。

因此,重新蓋上,不要打擾結合的state_change事件訂閱,訂閱剛,像這樣:

<!doctype html> 
<html> 
<body> 
    <h1>Pusher subscribe testcase</h1> 
    <p>Tip: check your console</p> 
    <script src="https://d3dy5gmtp8yhk7.cloudfront.net/2.1/pusher.js"></script> 
    <script> 
     var pusher, channel; 

     pusher = new Pusher('XXXXXXXXXXXXXXXX'); 
     channel = pusher.subscribe('test-channel'); 
     channel.bind('pusher:subscription_succeeded', function() { 
      console.log('subscribed'); 
     }); 
    </script> 
</body> 
</html> 
+1

「你不需要綁定到state_change事件,以訂閱頻道「 - 這是正確的,但真的只是偶然遇到這種行爲:) 轉發此Pusher的問題跟蹤器https://github.com/pusher/pusher-js/issues/45 – dirkbonhomme

2

它看起來像一個錯誤。如果您打開開發工具中的網絡選項卡並查看WebSocket連接「框架」信息,您可以看到發送兩次的協議事件pusher:subscribe。但是,代碼絕對只能調用pusher.subscribe一次。

您應該使用Pusher支持或向github repo提交問題來提出此錯誤。

pusher:subscribe protocol event sent twice