module.exports更新数组

时间:2018-01-01 02:25:58

标签: javascript arrays node.js module

我试图更好地理解module.exports。 据我了解,它可以用作双向通信(您可以向模块发送和接收数据。

但是,这不符合我的预期:

File1.js:

var Test = require("./Balances")
Test.push(12)

Balances.js:

var arrays = [10, 11];
module.exports = arrays

File2.js:

var Test = require("./Balances")
setInterval(function(){console.log(Test)},2000)

我想要的是能够从File1添加到数组,并读取File2中的输出。

File2读取初始数组就好了,但我推送的值永远不会显示在File2中。

但是,如果我在File1中添加了console.log(Test),那么该推送值就会出现在那里。 在重新运行File1时,我不会看到[12,12],只有[12],这意味着第一次推送永远不会写入Balances数组。

知道为什么吗?

3 个答案:

答案 0 :(得分:0)

当您从另一个javascript模块导入变量时,您可以按值获取该变量,而不是通过引用(您在给定的内存地址创建值的副本,您不必简单地获取指向该变量的指针)确切的变量)。因此,您只改变了Test中的File1.js变量;要反映console.log File2.jsFile1.js的更改,您必须从File2.js重新导出变异变量并将其导入// creates copy of the `Balance.js` `arrays` variable // stores value in new variable `Test` var Test = require("./Balances") // => [10, 11] // pushes 12 to the copy Test.push(12) // => [10, 11, 12] ,然后执行日志。< / p>

以下是您的代码分析:

File1.js:

// creates copy of the `Balance.js` `arrays` variable
// stores value in new variable `Test`
var Test = require("./Balances") // => [10, 11]
// This interval does nothing. The fact is, the mutated
// `arrays` var from `File1.js` does not effect the
// `arrays` var in any other modules scope.
setInterval(function(){console.log(Test)},2000) // => [10, 11]

File2.js:

var arrays = [10, 11]
module.exports = arrays

这是假设您在此处没有看到需要从入口点执行的额外代码。正如托马斯在评论中所说,在运行单个脚本之间没有任何状态。

完成您在帖子中尝试的内容:

Balances.js:

var test = require('./Balances')
test.push(12)

module.exports = test

File1.js:

var test = require('./File1')
function action() {
  console.log(test)
}

module.exports = action

File2.js:

var action = require('./File2')
action() // => [10, 11, 12]

main.js(切入点):

$ node main.js

运行append

希望这有帮助!

答案 1 :(得分:0)

它必须从未被推过,因为你实际上并不需要File1.js。这个main.js与原始的File1.js,File2.js和Balances.js文件完全一样。 (您可能想要setTimeout,并且如上所述,无论如何都没有效果,但它 工作。)

  <Button
        android:id="@+id/pre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/ic_launcher"
        android:text="Your Text"
        />

是的,修改传递的非基元会更新原始项目。它们不会被复制。不要在接下来的几年里花在冗余的构造上来重建已经发生的事情。

答案 2 :(得分:0)

从技术上讲,你可以使用这样的模块,但我会避免这种情况。像这样的变异状态会导致很多问题,特别是如果它是在分布式模块中完成的。

突然之间,你有一些似乎无处不在的错误或不必要的行为。因为它的来源与您的应用程序完全无关。玩得开心,找到/调试它。

我宁愿使用模块作为配置和内容的只读源,或者导出管理这些突变的自包含API以及该模块中发生的所有其他内容。

回到你的问题

您只需要在同一个应用程序中加载两个模块的公共入口点。

这可能是我的错误观念。每次调用node ...时,您都会启动一个单独的应用程序,具有单独的内存和状态。它加载你告诉它的文件,执行代码并最终完成。就像在浏览器中打开两个网站一样,一个加载File1,另一个加载File2

因此,您可以创建一个公共入口点,例如 main.js

require("./File1");
require("./File2");

然后在该公共入口点node main.js

启动应用程序

或者您可以运行node -i -r "./File1" -r "./File2"并开始输入更多JS。