2015-10-15 108 views
5

我已經在成功通過時設置了socket.emit事件。但是,當我綁定sockets.on事件時發生問題。它被多次解僱。socket.on事件每次響應都會重複一次以上

$(document).on('click', '#comment_button', function() { 
    $.ajax({ 
     // upon success 
     success: function (response) { 

      if (response) { 
       socket.emit('postcomment'); 

       socket.on('refresh', function() { 
        console.log('refresh'); 
        //This console.log('refresh') is coming multiple times. I mean its occurance increases with every successful ajax response. 
       }); 
     } 
    }); 
}); 

這裏是我的server.js

socket.on('postcomment', function() { 
     io.sockets.emit("refresh"); 
}); 

我覈實,我server.js socket.on函數被調用僅一次。 我不確定在ajax中socket.on('refresh', function() {}有什麼問題。 任何幫助將是偉大的。

P.Socket連接已經建立。那沒問題。

編輯:我糾正了錯誤。如果有人在將來閱讀此內容。 正如jason和Niranjan所提到的,socket.on{}事件在成功迴應時自我約束。 簡單: 每次調用click處理程序時,都會將其他事件偵聽器附加到套接字。您在之前的點擊中附加的聽衆會保持活動狀態。

,所以我做了以下修改WRT之前的代碼

$(document).on('click', '#comment_button', function() { 
    $.ajax({ 
     // upon success 
     success: function (response) { 

      if (response) { 
       socket.emit('postcomment'); 

     } 
    }); 
}); 

socket.on('refresh', function() { 
    console.log('refresh'); 
}); 

編碼愉快。

+0

您是否將函數的多個副本綁定到'socket.on''refresh'事件? – Jason

+0

你什麼時候調用ajax函數? –

+0

不僅console.log('刷新'); –

回答

4

我對以前的代碼做了以下更改。 它工作。

$(document).on('click', '#comment_button', function() { 
    $.ajax({ 
     // upon success 
     success: function (response) { 

      if (response) { 
       socket.emit('postcomment'); 

     } 
    }); 
}); 

socket.on('refresh', function() { 
    console.log('refresh'); 
}); 

socket。{}事件在成功響應時自動綁定。到 很簡單:每次調用點擊處理程序時,它都會將 附加事件偵聽器附加到套接字。您之前點擊上附加的 的聽衆會保持活動狀態。

1

每當ajax請求成功時,您都會在socket.onrefresh函數中附加匿名函數的另一個副本。

我做了這個測試。如果我點擊ajax按鈕,然後點擊「click me」按鈕,我會在控制檯中看到一個「howdy」。如果我再次單擊ajax按鈕,然後單擊「單擊我」,我會得到兩次「嗨」。再次單擊阿賈克斯,「按我」打印「你好」三次,等

<!DOCTYPE html> 

<html> 
<script src="jquery-2.1.4.min.js"></script> 
<script> 

function send_ajax_request() { 
    $.ajax("http://localhost/test.html").done(function() { 
     console.log("ajax done"); 
     $("#clicker").click(function() { 
      console.log("howdy"); 
     }); 
    }); 
} 

</script> 
</head> 
<body> 

<input type="button" value="ajax request" onclick="send_ajax_request()"> 
<input type="button" value="click me" id="clicker"> 
</body> 
</html> 

編輯: 因此,解決辦法,如果你的目標很簡單,就是建立一些行爲的socket.onrefresh事件,是分配該行爲在ajax函數之外以及可能被多次調用的任何函數之外。

+0

那麼我將如何避免在socket.on刷新函數中附加匿名函數的另一個副本,這樣我就不會多次使用howdy? @jason –

2

我的感覺是,插座工作正常。可能是,ajax()被多次調用。

例如,您在點擊某物時致電ajax()。並在成功socket.on('refresh')得到執行。所以現在,如果用戶在按鈕上多次點擊,ajax將被多次調用。這導致在sockets()

重複所以請確保您不要多次調用ajax。

您的問題已解決:)

相關問題