Node.js在执行函数之前需要等待循环完成
问题描述:
好的。所以我对节点非常陌生。我的脑子里现在正在旋转地狱。我已经阅读了许多类似的问题,但似乎无法让它正常运行。Node.js在执行函数之前需要等待循环完成
本质上,我解析通过服务器日志regex'ing特定的字符串,我将用于运行一些SQL查询。我已经得到这个在不需要循环的较小规模上工作。
我需要等待所有的ppsid运行通过_cssPPSID,这是生成一个字典对象和我的查询过滤器,然后在查询本身使用该过滤器运行查询,然后匹配该字典以配对结果从服务器日志中分析数据。
截至目前,此代码运行,但在第一次迭代后停止。我假设我错过了一个回调或简单的东西,以便脚本可以回到循环。
var ppsDict = new Object();
var ppsList = new Array();
var getURL = function(stdout) {
console.log('Creating ppsid url key value pairs');
var url_reg = /http\S+/g;
var ppsid_reg = /PPS_ID\=[0-9]+/g;
var ppsid = stdout.toString().match(ppsid_reg);
var url = stdout.toString().match(url_reg);
ppsDict[ppsid[0]] = url[0];
ppsList.push(ppsid[0]);
console.log(ppsDict);
};
var getPPSID = function(stdout, prodServer, searchResultProcessed) {
console.log("Collecting PPSID's");
var ppsid_reg = /PPS_ID\=[0-9]+/g;
var selector_reg = /selector\s\S+/g;
var ppsid = stdout.toString().match(ppsid_reg);
var selector = stdout.toString().match(selector_reg);
async.eachSeries(ppsid, function (ppsSelector, next) {
var urlQ = new urlQuery(prodServer, searchResultProcessed, ppsSelector);
_cssPPSID(urlQ, function(err, result) {
if(err) {
console.log(err);
}
next();
})
}, function (err) {
console.log('iterating done');
//queryProd(ppsList,ppsDict);
});
}
function urlQuery(prodServer, searchResultProcessed, ppsSelector) {
this.cssPPSID = "ssh " + prodServer + " 'sudo cat /mint/logs/topologies/'" + searchResultProcessed + " | grep " + ppsSelector + " | grep \"Downloading\"";
}
var _cssPPSID = (urlQ) => {
child_process.exec(urlQ.cssPPSID, ["-m"], (err, stdout, stderr) => {
if (stdout === 0) {
console.log('PPS_ID and CSS error combination not found');
return;
} else if (err) {
console.error(err, stderr);
return;
}
getURL(stdout);
});
};
答
你async.eachSeries
不会起作用,因为功能_cssPPSID
并不需要一个回调的第二个参数,所以next()
永远不会被调用。
尝试重写它像这样:
var _cssPPSID = (urlQ, callback) => {
child_process.exec(urlQ.cssPPSID, ["-m"], (err, stdout, stderr) => {
if (err) {
return callback(err);
}
if (stdout === 0) {
return callback(new Error('PPS_ID and CSS error combination not found');
}
// do stuff here
callback(null); // null indicates no error has happened
});
};