2017-04-04 22 views
0

在我的node.js應用程序中,我將一組客戶端套接字作爲數組集合在一起。發生通訊錯誤時,我只需在插座上撥打destroy即可。在將陣列從陣列中移除之前或之後銷燬插槽

我的問題是:我應該從數組中刪除之前還是之後銷燬套接字?文件沒有說太多。

var clientSockets = [] 

var destroySocketBefore = function(socket) { 
    socket.destroy() 

    var socketIdx = clientSockets.indexOf(socket) 

    if (socketIdx > -1) { 
     clientSockets.splice(socketIdx, 1) 
    } 
}  

var destroySocketAfter = function(socket) {   
    var socketIdx = clientSockets.indexOf(socket) 

    if (socketIdx > -1) { 
     clientSockets.splice(socketIdx, 1) 
    } 

    socket.destroy() 
} 
  1. destroySocketBefore的情況下,我不知道如果套接字在陣列中發現,如果我尋找它之前摧毀它,所以該數組還包含無效插座的可能性隨後的邏輯。

  2. destroySocketAfter的情況下,我不確定在從陣列中刪除的套接字上調用destroy是否會獲得所需的結果。在拼接數組後,系統是否有可能刪除套接字對象,因此有時我會在null對象上調用destroy

我測試,似乎這兩種方法的工作有沒有差別,所以我不知道哪種方法是正確的。

+0

這兩者之間沒有功能差異。該數組不受調用'socket.destroy()'的影響,並且套接字不受從數組中移除的影響,因此您可以按任意順序執行它們。 – jfriend00

+0

我不確定'銷燬'套接字將導致一個空對象,所以一切都會炸燬。 –

+0

調用'socket.destroy()'改變套接字對象的內部狀態,但不會使對象消失。這只是對象的一種方法。 Javascript不能像你在C/C++中那樣手動「釋放」對象。所以,'socket'對象仍然存在,調用'.destroy()'後仍然存在一個Javascript對象。無論您在哪個訂單中進行兩項操作都無關緊要。 – jfriend00

回答

0

兩種解決方案都是有效的,兩者實際上是相同的。被破壞的套接字將被刪除,因爲沒有競爭條件或類似的東西(因爲節點中的JavaScript執行都發生在同一個線程中)。

0

splice只會從用戶定義的數組中移除套接字,並且對它關閉沒有任何影響,因此根據您的答案,第二種方法是最佳選擇。