2015-09-30 15 views
0

請看看這一個SRC-代碼:如何刪除WebSocket連接的OnClose正常

var clients   = {}; // map<string, Connection> clients 
var clientsReverse = {}; // map<Connection, string> clientsReverse 

webSocketServer.on('connection', function(newclient) { // newclient is connection Object 

    newclient.on('message', function(message) { 

     var data = JSON.parse(message); 

     if (clients[data.name] === undefined) { 
      clients[data.name]  = newclient; 
      clientsReverse[newclient] = data.name; 
     } 

     // ... 

    }); 

    newclient.on('close', function(){ 
     log(clientsReverse[newclient]); // prints always the same string 

     // remove closed connection 
     var key = clientsReverse[newclient]; 
     delete clientsReverse[newclient]; 
     delete clients[key]; 
    }); 
}); 

我如果客戶走了刪除的連接。正如你所看到的,我爲此使用了兩個數組,但不幸的是它不起作用。如果我試圖斷開3個隨機客戶端,日誌打印總是相同的名稱...

任何想法我做錯了什麼?

+0

它是'object','array'的語法是'[]';我相信'newclient'就像是一個'object',而不是'string'或'number',它可能只是將'[object object]'設置爲'clientsReverse','newclient'應該包含一些獨特的像'id','name'這樣的變量...等等。記錄'newclient',看看它包含了什麼,然後使用'newclient.id'這樣的關鍵字。 – fuyushimoya

+0

@fuyushimoya哦,好的。我知道它是關聯數組或映射。 newclient是一個對象。 – dit

回答

0

clientsclientsReverse都不是數組。那些是對象。對象的行爲類似於JavaScript中的hashmaps,因此您可以使用字符串訪問它們的屬性。例如:

var a = { b: 5 }; 
console.log(a['b']); //5 

如果你試圖使指數走出一個對象(newclient是一個對象),它會首先toString它。 newclient.toString()的結果是[object Object],並且對於您使用的每個對象都是如此,並不重要,它是一個不同的對象。這就是爲什麼即使你使用不同的newclient對象,它總是會解決相同的密鑰。

我不確定你到底想要達到什麼目的。你可以嘗試使用數組([]),但那些只能有數字索引。你也可以嘗試使用某種客戶的獨特屬性,他們的ID或名字?

+0

好的,我必須找到方法,從列表中刪除newclient。因爲它是關閉連接,不再有效。 – dit

+0

你可以使用一個數組(一個真正的數組,'[]'),並迭代它。比較元素,直到找到想要刪除並刪除的客戶端。你可以比較對象本身,名字或者ID,如果他們有的話。 – ralh