Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript module.exports更新数组_Javascript_Arrays_Node.js_Module - Fatal编程技术网

Javascript module.exports更新数组

Javascript module.exports更新数组,javascript,arrays,node.js,module,Javascript,Arrays,Node.js,Module,我正在努力更好地理解module.exports。 据我所知,它可以用作双向通信(您可以向模块发送和接收数据) 但是,这并不像我预期的那样有效: File1.js: var Test = require("./Balances") Test.push(12) // creates copy of the `Balance.js` `arrays` variable // stores value in new variable `Test` var Test = require("./Bala

我正在努力更好地理解module.exports。 据我所知,它可以用作双向通信(您可以向模块发送和接收数据)

但是,这并不像我预期的那样有效:

File1.js:

var Test = require("./Balances")
Test.push(12)
// 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]
var test = require('./Balances')
test.push(12)

module.exports = test
Balances.js:

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

var Test = require("./Balances")
setInterval(function(){console.log(Test)},2000)
// 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]
var test = require('./File1')
function action() {
  console.log(test)
}

module.exports = action
我想要的是能够从文件1添加到数组中,并在文件2中读取输出

File2可以很好地读取初始数组,但我推送的值从未显示在File2中

但是,如果我在File1中添加一个console.log(Test),那么这个pushd值就会出现在那里。 但是,在重新运行File1时,我没有看到[12,12],只有[12],这意味着第一次推送从未写入平衡数组


知道为什么吗?

当您从另一个javascript模块导入变量时,您通过值而不是引用获取该变量(您在给定的内存地址创建一个值的副本,而不仅仅是获取指向同一个变量的指针)。因此,您只对
File1.js
中的
Test
变量进行了变异;要在
console.log
中反映这些更改,您必须从
File2.js
中重新导出变异变量,并将其导入
File2.js
,然后执行日志


下面是对您的代码的分析:

File1.js:

var Test = require("./Balances")
Test.push(12)
// 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]
var test = require('./Balances')
test.push(12)

module.exports = test
File2.js:

var Test = require("./Balances")
setInterval(function(){console.log(Test)},2000)
// 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]
var test = require('./File1')
function action() {
  console.log(test)
}

module.exports = action

这都是假设你有额外的代码没有看到这里是必需的,并从一个入口点执行


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

Balances.js:

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

var Test = require("./Balances")
Test.push(12)
// 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]
var test = require('./Balances')
test.push(12)

module.exports = test
File2.js:

var Test = require("./Balances")
setInterval(function(){console.log(Test)},2000)
// 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]
var test = require('./File1')
function action() {
  console.log(test)
}

module.exports = action
main.js(入口点):

运行
$node main.js


希望这有帮助!

它必须从未被推送过,因为您实际上在任何地方都不需要File1.js。这个main.js与原始File1.js、File2.js和Balances.js文件的工作方式完全一样。(您可能想要setTimeout,正如前面提到的那样,它无论如何都没有效果,但确实有效。)


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

从技术上讲,您可以使用这样的模块,但我会避免。这样的状态变化可能会导致很多问题,特别是在分布式mo中进行时杜勒斯

突然之间,你出现了一些错误或不必要的行为,这些行为似乎是无中生有的。因为它的来源是你应用程序中完全不相关的部分。祝你玩得开心,找到/调试它

我更愿意使用模块作为配置和其他内容的只读源,或者导出一个自包含的API来管理这些变化和模块中发生的所有其他事情


回到你的问题上来 您只需要一个公共入口点,在同一个应用程序中加载两个模块

这可能是我们的误解。每次调用
节点…
都会启动一个具有独立内存和状态的独立应用程序。它加载您告诉它的文件,执行代码并最终完成。就像在浏览器中打开两个站点一样,一个加载
文件1
,另一个加载
文件2

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

require("./File1");
require("./File2");
然后在该公共入口点
node main.js


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

重新运行文件1和
写入Balances数组的意思是什么?如何加载这些脚本?我从命令行加载这些脚本。我的意思是Balances.JS中的数组末尾应该有一个额外的12。当然不是在文件本身中,而是在内存中。但是这样做的esn不会在file2中得到反映,file2每2秒读取一次数组。因此,您首先在命令行中执行
file1
,然后执行
file2
?但是您知道这两个执行是完全独立的,它们不共享任何内存或状态。啊哈,不知道。我是基于这个whole关于这个问题的最后一个答案的考验:这澄清了很多!谢谢。有没有更好的方法可以将数组从一个文件转换到另一个文件,而不使用JSON文件,也不直接要求彼此?@Wannes很高兴听到。我为您添加了一个示例。我假设您这样做是为了了解更多信息,因为这种ting exported imports(导出导入)令人困惑,在现实世界中根本不需要。通常,所有这些都会在单个范围内发生。OOO模块不会导出数据的副本,
require()也不会
返回一个克隆。您所需要的只是一个公共入口点,它需要将两个文件都导入到同一个应用程序中。Thomas,我想您的意思是模块不导出数据副本,
在独立导入的情况下也不需要
。但很明显,我的示例是派生导入。很明显,Wannes是该语言的新成员,我没有为了简单起见,ant不得不偏离他试图编写的代码。请仔细阅读