【问题标题】:Node array scope issue节点数组范围问题
【发布时间】:2016-12-21 08:29:47
【问题描述】:

我觉得这是一个非常愚蠢的问题,但我无法理解为什么我会在回调函数中看到奇怪的行为。 我定义了一个名为 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 范围和异步操作有很好的理解,但我很难弄清楚是什么导致了这种行为。这与节点模块加载器的工作方式有关吗?还是我只是错过了一些明显的东西?任何帮助,将不胜感激。

【问题讨论】:

标签: javascript arrays node.js scope


【解决方案1】:

问题正是在这一行:

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

这样做不是清空数组,而是在该变量中分配一个新数组。但是您已经导出了旧文件,这是因为它没有反映在其他文件中。

有人已经输入了comments 如何清空数组,在你的情况下,我会使用方法 2 或 3(2 是我所说的最常见的方法)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 2013-05-18
    • 2017-02-17
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多