2016-05-17 36 views
0

這是我的函數:在socket.io中是合法的嗎?

io.on('connection', function (socket) { 
      socket.on('checkcrn', function (msg) { 
       socket.on('error', function(err){ 
        console.log("err + " + err); 
       }) 
       console.log("message " + msg); 
      }); 
     }); 

我所試圖做的是調用同一個插座上,但另一事件不同的事件。這是可能的,還是我做錯了什麼?

回答

1

下面是一個獨立版本,模仿你的代碼:

const EventEmitter = require('events').EventEmitter; 

let socket = new EventEmitter(); 

socket.on('checkcrn', function (msg) { 
    socket.on('error', function(err){ 
    console.log("err + " + err); 
    }) 
    console.log("message " + msg); 
}); 

socket.emit('checkcrn', 'hello world #1'); 
socket.emit('checkcrn', 'hello world #2'); 
socket.emit('error', 'error #1'); 

如果您運行,你會看到err + error #1登錄兩次。更糟糕的是:如果您發送更多checkcrn消息,則會發送針對您發送的每條checkcrn消息的額外錯誤消息。這是因爲您爲每個checkcrn消息添加了一個新的error偵聽器。

您可以通過error聽衆的聲明移動到相同的水平checkcrn聽衆解決這個問題:

io.on('connection', function (socket) { 

    socket.on('checkcrn', function (msg) { 
    console.log("message " + msg); 
    }); 

    socket.on('error', function(err){ 
    console.log("err + " + err); 
    }); 

}); 

它仍然是相同的socket您正在收聽連接到。

+1

至於我能理解跟蹤,他希望得到'error' * *僅在客戶端已經發送'checkcrn'後**。但你是對的 - 這種事情不應該按照這樣的方式完成。最好有一些套接字級變量來確定我們是否希望錯誤偵聽器啓動或不啓動。 –

+0

@AndreyPopov好點,我可能誤解了。 – robertklep

+0

這解決了我的問題,間接:) – abedzantout

0

這是一個很好的例子,它證明了內存泄漏。

通過分配事件偵聽器你在每一個新的事件創建新的處理程序已經陷入(無後刪除它們)等事件偵聽器,這是非常糟糕的內部。

保持聽衆在同一水平,一切都會好的。

FYI:的情況下,你不需要跟蹤某種事件,你可以簡單地拆散這個事件做socket.removeListener('eventname', functionReference)