2014-02-07 30 views
4

我有一個有一個按鈕的頁面。當按鈕被點擊時,它通過socket.io獲取數據。但是,每次重新加載頁面時,socket.io都會從前一個數據集中發回一個額外的數據副本。所以我的數據在第一次加載頁面時看起來很好(例如:abcd)。然後重新加載頁面將返回2n數據(abcdabcd),再次加載頁面我得到3n數據(abcdabcdabcd)等Socket.io在瀏覽器刷新後發出重複數據

如何避免重複數據發送到客戶端時重新加載頁面?這是我的代碼。

服務器端:

app.get('/test', function(req, res){ 

     // some code... 

    io.sockets.on("connection", function(socket){ 

     var socketFn = function(data){ 
      socket.emit("trends", { 
       trends: JSON.parse(redisData) 
      }); 
     }; 

     socket.on("action", socketFn); 

     socket.on("disconnect", function(){ 
      socket.removeListener("action", socketFn); // this doesn't work 
     }); 

    }); 
    res.render('test'); 

}); 

客戶端:

var socketOpts = { 
    "sync disconnect on unload" : true 
}; 
var socket = io.connect("", socketOpts); 

socket.on("trends", function(data){ 
    // data received from the node server, so do something with it 
}); 


function action(){ 
    socket.emit("action", {phrase: "some dummy data"}); 
    return false; 
} 

// already checked client side doesn't fire multiple click event 
$("button#click").off("click").on("click", action); 

回答

3

那是因爲你聽連接多次客戶擊中頁面。

app.get('/test', function(req, res){ 
//when client opens the page 

    io.sockets.on("connection", function(socket){ 
    //start listening to new connection 
    ... 

從您的路由中初始化連接eventlisteners被認爲是一個壞主意。它應該只在全球範圍內完成一次。在這裏,每當你的客戶端訪問頁面時,就會多次訪問頁面來監聽事件。

+0

如果我想在我的路由中初始化連接事件偵聽器該怎麼辦?如果我有10頁,只有1我想實現socket.io,該怎麼辦? – miksiii

+0

@miksii仍然是一個壞主意。您創建多個連接處理程序 - 與頁面被擊中的次數相同。頁面命中將會終止你的socket.io服務器。如果您有單獨的問題,請創建一個新問題。我的回答解決了OP的特殊問題。 – user568109

+0

我想知道我是否應該創建一個新的話題。在我的情況下,我有/ dashboard路線呈現dashboard.jade頁面。在該頁面中,我使用socket.io和mongodb進行簡單的聊天應用程序。我注意到,如果我在我的/儀表板路徑中爲套接字設置了編程邏輯,則每次刷新頁面時都會複製數據。例如;如果我發送「abc」,它會發送「abc」,比我刷新頁面併發送「abc」它會發送「abc」,「abc」。對此有何建議? PS。如果您願意,我可以創建一個新問題並作爲答案提出建議。謝謝。 – miksiii