我制作了一个 Node 网络应用程序并且它可以工作。但是,我将其构建为整体,并且我尝试将其分解为模块以进行练习。
长问短,在模块中,如何从回调结果定义变量并以主应用程序可用的方式存储它?就像将模块中的结果存储到全局变量并将其导出一样简单吗?
在我的整体版本中:
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 作为模块本身的变量。如果是返回,我只需根据函数的返回在主应用程序中定义一个变量。但由于该函数通过回调而不是返回获取数据,那么将该数据返回到主应用程序并可用于 app.get 函数的“正确”方法是什么?是在构建时,还是在 50 个函数运行完成后?
最佳答案
有许多不同的方法可以做到这一点,但我见过的最常见的模式是将值添加为应用程序(或类似)的新属性。例如:
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 语句等,但希望您能理解。
总而言之,通常您希望避免这样的全局变量。特别是,如果您的应用程序必须扩展到多个进程(应用程序的每个实例将单独获取,并且可能最终会出现不同的状态),那么在内存中存储可能会发生变化的内容将导致稍后出现错误。
关于javascript - 在 Node.js 中,如何存储主应用程序中模块函数的回调数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47595770/