2016-12-21 5 views
1

Я чувствую, что это довольно глупый вопрос, но мне трудно понять, почему я вижу странное поведение в функции обратного вызова. Я определил массив, называемый clientList, который я экспортирую и использую в других файлах. Этот код запускается, когда клиент подключается к моему серверу.Проблема с узлом массива

Когда я говорю clientList.splice или clientList.push, все работает так, как ожидалось, и массив clinetList отражает мое изменение в других файлах, которые требуют() в нем. Однако, если я говорю напрямую назначить ClientList (например, clientList = [ ]), то это изменение не отражается в других файлах. Если я распечатаю содержимое ClientList внутри обратного вызова, изменение будет отражено в любом случае.

var clientList = []; 

module.exports.socketHandler = (socket) => { 
var client = new Client(socket); 
clientList.push(client); 

socket.on('end',function(){ 
    clientList = [] //This does not change the exported array 
    clientList.splice(0,1); //This does change the exported array 
    console.log("Client connection ended: "+clientList.length); //This always changes 
}); 

} 

module.exports.clientList = clientList; 


//IN A DIFFERENT FILE 
//This code is run every few seconds on a loop 
var example = require('./sockets.js'); 
console.log("Array Size: "+example.clientList.length); 

Мой вопрос: почему здесь есть разница. У меня хорошее понимание области javascript и асинхронных операций, но мне трудно понять, что вызывает это поведение. Связано ли это с тем, как работает загрузчик узла узла? Или я просто пропущу что-то очевидное? Любая помощь будет оценена по достоинству.

+2

[Является ли JavaScript паролем или ссылкой по языку?] (Https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass- по-значение-язык) – Andreas

+0

Это интересно. Я знаю, что javascript передает значения таким образом, но поскольку я явно не передавал никаких аргументов, это не происходило со мной. Итак, даже если вы просто ссылаетесь на переменную в родительской области, применяются те же правила? – Pancake

+1

Когда у вас есть refrences массиву, вы не должны его пустить. используйте другие методы, такие как 'clientList.lenght = 0'. Смотрите: [how-do-i-empty-a-array-in-javascript] (http://stackoverflow.com/a/1232046/5048383) – dNitro

ответ

1

Проблема именно в этой строке:

clientList = [] //This does not change the exported array 

Делая это, вы не опорожнение массив, но назначение нового в этой переменной. Но вы уже экспортировали старый, так что это не отражается в других файлах.

Кто-то уже положил в comments, как очистить массив, в вашем случае я бы использовал метод 2 или 3 (2 - самый распространенный из них, который я бы сказал).

Смежные вопросы