【问题标题】:Global Variables alternative全局变量替代
【发布时间】:2016-01-18 19:31:35
【问题描述】:

我想创建一个可供所有 .js 文件访问的数组。该数组也必须是可更新的,并且更新后的更改必须反映在使用该数组的所有其他文件中。

我读到使用 GLOBAL 变量不是一个好方法,但有什么替代方法?

//file 1 which contains my global variable
var mySharedArray = ['helo']; 
module.exports = {
mySharedArray: mySharedArray,
get: function(){
    console.log(mySharedArray);
} 
}    

//file 2 where i am pushing new-data 
router.get('/workerequestest',function(req,res){
queue.push("moreData");
require('../config/globalQueue').get();
require('../config/startWorkerQueue');
res.send(200,'message recieved');
});

//file 3 where i am checking the updated values
var interval = setInterval(function() {
var Queue = require('../config/globalQueue').mySharedArray;
require('../config/globalQueue').get();
}, 10000,'hello' ,'checking for New processes');

【问题讨论】:

  • 一个在需要所述变量的地方需要的模块。
  • 这和node.js没有任何关系。
  • 感谢您的快速。你能更具体一点吗?可以用一个例子来解释。

标签: javascript global-variables


【解决方案1】:

node.js 中的适当模块化不使用实际的全局变量,因为这使得实际利用可重用模块变得更加复杂,并可能与其他全局变量发生冲突。

可以使用的一种设计模式是将共享数据放在其自己的模块中,然后在需要时将require() 放在该模块中。

// shared-data.js
var mySharedArray = [...];

module.exports = {
    mySharedArray: mySharedArray
}

然后,在每个想要访问该数组的模块中,您可以这样做:

// someothermodule.js

var sharedArray = require('./shared-data.js').mySharedArray;


// this modification will change the main array and will be seen by
// all modules that are sharing it
sharedArray.push("moreData");

之所以有效,是因为在 Javascript 中分配数组时,它们不会被复制,而是共享指向原始数组的指针。因此,对分配值的任何修改都只是指向原始对象,因此会更改原始数组。因此,所有模块都可以访问相同的原始数组。


我刚刚在我自己的三个文件中测试了这个概念,它运行良好。这是我的三个文件:

服务器文件:

// shared-server.js
var express = require('express');
var app = express();
var server = app.listen(80);
var shared = require('./shared-var');
require('./shared-interval.js')

var cntr = 0;

app.use(express.static('public'));

app.get("/test", function(req, res) {
    shared.mySharedArray.push(++cntr);
    shared.get();
    res.send(200,'message received');
});

共享变量文件:

//shared-var.js
var mySharedArray = ['helo']; 
module.exports = {
    mySharedArray: mySharedArray,
    get: function(){
        console.log(mySharedArray);
    } 
}

间隔文件:

//shared-interval.js
var interval = setInterval(function() {
    require('./shared-var').get();
}, 1000);

当我运行它时,它每秒输出mySharedArray 的值。每次我使用浏览器访问http://localhost/test 时,它都会为mySharedArray 添加一个新值,我会在控制台中看到它。这是我所期望的行为。

【讨论】:

  • 感谢@jfriend00 的回答。但是你能用一个例子解释一下吗?
  • @Furious - 我现在的回答中有一个例子。
  • 我尝试使用上面的示例。它没有工作。我使用了三个文件 1. 存储数据 2. 更新数组 & 3 。获取更新的数组。但我无法在第三个文件中获得更新的值。更新后的值仅显示在第三个文件中。
  • @Furious - 只要您修改数组对象而不为其分配新数组,它就可以正常工作。为了让我帮助您进行实施,您必须展示您尝试过的实际代码(通过将其编辑到您的问题中),以便我可以看到您在做什么不同。
  • 我已经用我正在尝试的示例编辑了问题。请看看我错在哪里。
【解决方案2】:

您可以将它们放在一个单独的模块中,该模块在您需要它的任何模块中都需要,否则您可以使用单独的存储服务,例如 redismemcached 来存储您的数据数组。

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2021-09-10
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多