NodeJS:模块共享状态的值

时间:2017-07-02 07:18:33

标签: javascript node.js

我正在阅读nodejs的教程,在了解模块的共享状态时,我遇到了一些疑问:

我写了这段代码:

Sparsh.js

var popcorn = require('./popcorn');
popcorn.favPopCorn = 'cheese';
console.log(popcorn.favPopCorn);

Ravi.js

var popcorn = require('./popcorn');
console.log(popcorn.favPopCorn);

app.js

require('./Ravi');
require('./Sparsh');
require('./Ravi');

popcorn.js

module.exports = {
    printRate : function() {

        console.log('popcorn rate');
    },
    favPopCorn : ''
};

输出       (空白) 起司       (空白)

根据输出,第一个空白是相当可观的,因为我们没有为favPopCorn分配任何值。但是在我将值分配给Sparsh.js中的favPopCorn后,它应该打印出奶酪'我们再次使用require('。\ Ravi.js');因为它是一个共享的状态。

请帮忙

2 个答案:

答案 0 :(得分:1)

Ravi.js 共享(好吧,“缓存”是一个更好的词),所以它只加载一次(第一次)。第二次,Node知道它已经加载了,并且第二次没有加载(/执行)它(它不输出空白,它根本不输出)。< / p>

解决此问题的常用方法是导出函数:

// Ravi.js
var popcorn = require('./popcorn');

module.exports = function() {
  console.log(popcorn.favPopCorn);
}

// Sparsh.js
var popcorn = require('./popcorn');

module.exports = function() {
  popcorn.favPopCorn = 'cheese';
  console.log(popcorn.favPopCorn);
}

// app.js
require('./Ravi')();
require('./Sparsh')();
require('./Ravi')();

答案 1 :(得分:0)

这种思维的一个干净模式是在共享模块中创建一个new的对象:

//popcorn.js

function popcorn(){
    this.printRate = function() {
        console.log('popcorn rate');
    }
    this.favPopCorn = "" 
}

module.exports = new popcorn()

现在,当您在其他模块中获取并设置favPopCorn属性时,您将操作单例。