我试图更好地理解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数组。
知道为什么吗?
答案 0 :(得分:0)
当您从另一个javascript模块导入变量时,您可以按值获取该变量,而不是通过引用(您在给定的内存地址创建值的副本,您不必简单地获取指向该变量的指针)确切的变量)。因此,您只改变了Test
中的File1.js
变量;要反映console.log
File2.js
中File1.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。