我有两个文件,我想在文件2中包含所有必须在脚本加载时执行的功能,我尝试了模块导出,但是在文件2执行时,它不会更新文件1中的变量“ kList”
我将在文件2中包含所有函数,这将更新文件1中的变量
文件1:-
var kList=[];
var exlist=require("./file2.js");
exlist.lister()
setInterval(function(){
console.log(kList);},3000)
文件2:-
var request= require('requests');
function lister(){
request.get("www.example.com",function(err,response,body){
body.forEach(body=>{
kList.push(body.item)
});
});
}
module.exports.lister=lister;
答案 0 :(得分:1)
一个模块中的代码无法访问另一模块中的变量。
要使您的lister
函数能够访问分配给klist
的数组,您需要将其作为参数传递。
exlist.lister(klist);
和
function lister(klist) {
答案 1 :(得分:0)
在NodeJS中,您无法从其他模块访问变量。
如果需要设置值,则应以返回或获取您需要更改的变量的方式编写模块。
例如,您可以重写模块2以接受变量:
module.exports = function (kList) {
request("www.example.com",function(err,response,body){
body.forEach(body=>{
kList.push(body.item)
})
})
}
在模块1中:
const module2 = require('./module2');
var kList = [];
moduel2(kList);
更好的方法是让 module2 返回值,因为它是一个异步函数,您应该从 module1 传递 callback 函数
// module 2
module.exports = function (callback) {
request(url, callback);
}
您还可以预处理数据并仅传递结果:
module.exports = function (callback) {
request(url, function () {
var data = [];
body.forEach(/* process the data*/);
callback(data);
});
}
一种更简洁的方法是承诺该模块:
// module 2
module.exports = function () {
return new Promise(function (resolve, reject) {
request(url, function (err,response,body) {
if (err) {
reject(err);
return;
}
resolve(body.item);
});
});
}
因此,在您的 module1 中,您可以得到承诺的结果:
// module 1
var kList=[];
const module2 = require('./module2');
module2().then(items => (kList = items.reduce(/* ... */))
.catch(error => (/* handle the error here*/));
这是一个承诺,您可以根据需要在 module2 或 module1 中随意链接任意数量的图层,只记得从返回一些内容then()。
答案 2 :(得分:0)
我认为您没有在参数中传递kList
File1:
var kList = [];
var exlist = require('./file2');
exlist.lister(kList)
setInterval(function () {
console.log(kList);
}, 3000)
File2:
function lister(kList) {
body = [1,2,3,4]
body.forEach(item => {
kList.push(item)
});
}
module.exports.lister = lister;