我想更好地理解module.exports。据我所知,它可以用作双向通信(您可以向模块发送和接收数据。
然而,这并不如我所预期的那样有效:
File1.js:
var Test = require("./Balances")
Test.push(12)Balances.js:
var arrays = [10, 11];
module.exports = arraysFile2.js:
var Test = require("./Balances")
setInterval(function(){console.log(Test)},2000)我想要的是能够从File1中添加到数组中,并在File2中读取输出。
File2读取初始数组很好,但我推送的值从未在File2中显示。
但是,如果我在console.log中添加了一个File1 (测试),那么这个推送值就会出现在那里。但是,在重新运行File1时,我没有看到12、12、12,这意味着第一次推从未写入Balance数组中。
知道为什么吗?
发布于 2018-01-01 02:58:43
当您从另一个javascript模块导入一个变量时,您可以通过值而不是引用来获得该变量(在给定的内存地址上创建值的副本,而不是简单地获得指向相同变量的指针)。因此,您只在File1.js中修改了File1.js变量;要在File2.js中反映console.log中的这些更改,您必须从File1.js中重新导出已变异的变量并将其导入File2.js中,然后执行日志操作。
下面是对您的代码的分析:
File1.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]File2.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]这都是假设您在这里没有看到需要并从入口点执行的额外代码。正如Thomas在评论中所说,在运行单个脚本之间不存在持久状态。
为了完成你在你的帖子中试图做的事情:
Balances.js:
var arrays = [10, 11]
module.exports = arraysFile1.js:
var test = require('./Balances')
test.push(12)
module.exports = testFile2.js:
var test = require('./File1')
function action() {
console.log(test)
}
module.exports = actionmain.js (入境点):
var action = require('./File2')
action() // => [10, 11, 12]运行$ node main.js
希望这能有所帮助!
发布于 2018-01-01 08:29:55
它必须从未被推送,因为您实际上不需要任何地方的File1.js。这个main.js与原来的File1.js、File2.js和Balances.js文件完全一样。(您可能想要setTimeout,而且正如前面提到的,这是没有任何影响的,但它确实有效。)
require('./File1')
require('./File2')是的,修改传递的非原语将更新原始项。它们没有被复制。不要在接下来的几年里花在一个多余的结构上来重建已经发生的事情。
发布于 2018-01-01 12:07:32
从技术上讲,你可以使用这样的模块,但我会避免这样做。这样的变异状态可能会导致许多问题,特别是在分布式模块中进行的情况下。
突然间,你出现了一些错误或不想要的行为,似乎是无处可寻。因为它的来源是在你的应用程序的一个完全无关的部分。玩得开心,找到/调试它。
我宁愿使用模块作为信任和东西的只读源,或者导出一个独立的API来管理这些突变和该模块中发生的其他一切。
回到你的问题
您所需要的只是一个公共入口点,在同一个应用程序中加载两个模块。
这可能是我们的误解。每次调用node ...时,都会使用分离的内存和状态启动单独的应用程序。它加载您告诉它的文件,执行代码并最终完成。就像在浏览器中打开两个站点一样,一个加载File1,另一个加载File2。
因此,您可以创建一个公共入口点,如main.js。
require("./File1");
require("./File2");然后在公共入口点node main.js启动应用程序。
或者您可以运行node -i -r "./File1" -r "./File2"并开始键入更多的JS。
https://stackoverflow.com/questions/48046826
复制相似问题