我制作了一个节点网络应用程序,它可以工作。但是,我将其构建为整体式,并且我正尝试将其分解为模块以进行练习。
长问题简而言之,在模块中,如何根据回调结果定义变量并以主应用程序可用的方式存储它?是否像将模块中的结果存储到全局变量并将其导出一样简单?
在我的整体版本中:
应用程序.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
函数通过 page 变量运行 50 次。
现在我试图分解它:
应用程序.js
var resultsArray =[];
var getDatafromHTTP = require(module.js).getDatafromHTTP
getDatafromHTTP(0);
app.get(some function that displays the resultsArray)
模块.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 成为模块本身的变量。如果是返回,我会根据函数的返回在主应用程序中简单地定义一个变量。但是由于该函数通过回调而不是返回来获取数据,那么将数据返回到主应用程序并可供 app.get 函数使用的“正确”方法是什么?无论是在构建时,还是在 50 个函数运行完成后?
有许多不同的方法可以做到这一点,但我见过的最常见的模式是将值添加为 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);
});
显然,我将省略一些步骤,例如一些 require 语句等,但希望您能理解。
综上所述,您通常希望避免这样的全局变量。特别是,如果您的应用程序必须扩展到多个进程(应用程序的每个实例将单独获取,并且可能会以不同的状态结束),那么在内存中存储可能会发生类似变化的内容将在以后导致错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句