我有一个javascript模块,我将其导入到主代码/主代码的开头,并在其中执行forEach,在此主代码中有一个调用模块方法的循环:
results.forEach(function(result) {
for(const item of items .......){
exampleModule.metodo(result, item)
}
});
到目前为止,问题是模块的值正在混合,模块根据结果X的项Y是不动态的,有点“干扰”了一切……
我想到了一种解决方法,我不知道这是否是最佳实践,在对象内声明const exampleModule = require('./modules/example.js')并为该对象提供引用,例如作为商品ID,因为每个ID都是唯一的:
let objetos = {}
results.forEach(function(result) {
for(const item of items .......){
objetos[item.id] = require('./modules/example.js')
objetos[item.id].metodo(result, item)
}
});
简而言之,我希望每个循环项都创建一个模块实例而不会受到干扰,如果我在位置0的项目中实例化该模块,则模块中的所有内容仅应由该项目0使用,如果第1项是同一件事,1 n可以更改位置0使用的模块的值,依此类推,这可能吗?有人可以帮我吗?
答案 0 :(得分:1)
我有相同的想法,并对其进行了一次检查,但这基本上是require()函数返回的单例。
如果有
jQuery = require('jquery');
jQuery.fn.foobar = function() {
this.css({color:red});
}
然后在另一个文件中可以
$ = require('jquery');
$('hello').foobar();
唯一的条件是您用于require()
的字符串大小写相同。
require('libs/myModule.js') != require('libs/mymodule.js');
在后台创建地图:
objects = {
'jquery' : ....
'add' : ....
'strcasecomp' : ....
'/www/htdocs/site/libs/myModule.js' : ...
}
require()
发生的情况是,如果对象存在于地图中,则将其返回。如果不存在,则会找到,实例化,映射并返回相关文件。
答案 1 :(得分:1)
Node.js缓存导入的模块。因此,将它们循环需要没有副作用。 here in docs说明了缓存。
是的,最好不要在代码深处导入模块,因为它被认为不易读。您可以随时执行以下操作:
let objetos = {}
const exampleModule = require('./modules/example.js');
results.forEach(function(result) {
for(const item of items .......){
objetos[item.id] = Object.assign({}, exampleModule);
objetos[item.id].metodo(result, item)
}
});