我觉得这是一个非常愚蠢的问题,但我很难理解为什么我在回调函数中看到奇怪的行为。 我定义了一个名为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范围和异步操作有很好的理解,但是我很难搞清楚导致这种行为的原因。这与节点模块加载器的工作方式有关吗?或者我只是遗漏了一些明显的东西?任何帮助,将不胜感激。
答案 0 :(得分:1)
问题恰恰在于这一行:
clientList = [] //This does not change the exported array
这样做不是要清空数组,而是在该变量中指定一个新数组。但是你已经导出旧的了,所以那是因为它没有反映在其他文件中。
有人已经在comments中放入了如何清空阵列,在你的情况下我会使用方法2或3(2是我说的最常见的一种)。