2016-01-18 84 views
1

我想創建一個可供所有.js文件訪問的數組。該數組也必須是可更新的,並且更新的更改必須反映在使用該數組的所有其他文件中。全局變量替代

我讀過使用GLOBAL變量不是一個好的方法,但有什麼替代方法?在node.js中

//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'); 
+0

需要所需變量的模塊。 –

+0

這和node.js沒有任何關係。 – Blubberguy22

+0

感謝您的快速。你可以更具體一點..可以用一個例子來解釋。 – Furious

回答

5

正確的模塊化水平,使實際利用可重用的模塊更加複雜,並就與其他全局可能產生的衝突並不使用實際的全局。

可以改爲使用的一種設計模式是將共享數據放入其自己的模塊中,然後在該模塊中只需要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增加一個新值,並在控制檯中看到它。這是我期望的行爲。

+0

謝謝你的回答@ jfriend00。但你能用一個例子來解釋嗎? – Furious

+0

@憤怒 - 現在我的回答中有一個例子。 – jfriend00

+0

我試過使用上面的example.it沒有工作。我使用了三個文件1.存儲數據2.更新數組&3。獲取更新的數組。但我無法獲得第三個文件中的更新值。更新的值僅在第三個文件中顯示。 – Furious

1

您可以將它們放在一個單獨的模塊中,該模塊在您需要的任何模塊中都需要,否則您可以使用單獨的存儲服務(如redismemcached)來存儲您的數據數組。