我制作了一个节点网络应用程序,它的工作原理。但是,我把它建成单片,我试图把它分解成模块进行练习。
很长的问题简短,在一个模块中,我如何从回调结果中定义变量并以主应用程序可用的方式存储它?它是否像将模块中的结果存储到全局变量并将其导出一样简单?
在我的monolthic版本中:
app.js
var resultsArray = [];
function getDatafromHTTP(page){
callback(data){
resultsArray.push(data);//push json elements to array
if(page < 50){page++;getDatafromHTTP(page);}
}
}
getDatafromHTTP(0);
app.get(some function that displays the resultsArray)
getDatafromHTTP
函数通过页面变量运行50次。
现在我试图将其分解:
app.js
var resultsArray =[];
var getDatafromHTTP = require(module.js).getDatafromHTTP
getDatafromHTTP(0);
app.get(some function that displays the resultsArray)
module.js
exports.getDatafromHTTP = function(page){
callback(data){
resultsArray.push(data);//push json elements to array
if(page < 50){page++;getDatafromHTTP(page);}
}
}
//error resultsArray not Defined.
我明白为什么在模块中没有定义resultsArray,并且理解我可以将resultsArray作为模块本身的变量。如果它是一个返回,我只需根据函数的返回在主应用程序中定义一个变量。但是因为函数通过回调而不是返回来获取数据,所以&#34;对&#34;将数据恢复到主应用程序并可用于app.get函数的方法?无论是在构建时,还是在50个函数运行完成后?
答案 0 :(得分:1)
有许多不同的方法可以做到这一点,但我见过的最常见的模式是将值添加为app(或类似)的新属性。例如:
module.exports = function(app) {
return function getHttpData(callback) {
request.get('http://example.com/', (err, results, body) => {
if (err) return cb(err);
app.httpData = body;
return cb(null, body);
});
}
}
然后在您的通话代码中,您可以执行以下操作:
var app = express();
var getHttpData = require('./get-http-data.js')(app); // <-- note I'm passing the app object in here
// sometime later
getHttpData((err, data) => {
console.log(data);
});
显然,我已经离开了一些像需要声明等等的步骤,但希望你能得到这个想法。
所有这一切,经常你想避免像这样的全局变量。特别是,如果您的应用程序必须扩展到多个进程(应用程序的每个实例将单独获取,并可能结束不同的状态),那么存储可能会在内存中更改的内容将导致以后的错误。
答案 1 :(得分:0)
module.js
function getDataFromHTTP() {
return callback(data) {
return data;
}
}
module.exports = getDataFromHTTP;
app.js
var getDataFromHTTP = require('module.js');
var resultsArray = [];
for (var page=0; page<50; page++) {
resultsArray.push(getDataFromHTTP);
}