我觉得这是一个非常愚蠢的问题,但是我很难理解为什么我在回调函数中看到奇怪的行为。
我定义了一个名为clientList的数组,该数组可以导出并在其他文件中使用。当客户端连接到我的服务器时,将在此处运行此代码。
当我说clientList.splice或clientList.push时,一切都按预期工作,并且clinetList数组反映了我在其他文件中的更改,这些文件中都需要require()。但是,如果我说直接分配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范围和异步操作有很好的了解,但是我很难弄清是什么原因导致了这种行为。这与节点模块加载器的工作方式有关吗?还是我只是缺少明显的东西?任何帮助,将不胜感激。
最佳答案
问题正好在此行中:
clientList = [] //This does not change the exported array
这样做不是要清空数组,而是在该变量中分配一个新数组。但是您已经导出了旧文件,这是因为它没有反映在其他文件中。
有人已经输入了comments如何清空数组,在您的情况下,我将使用方法2或3(2是我会说的最常见的方法)。