Node.js 在执行函数之前需要等待循环完成

Node.js need to wait for for loop to finish before executing function

好的。所以我对节点非常陌生。我的思绪现在正在回调地狱中旋转。我已经通读了许多类似的问题,但似乎无法正确地把它写到 运行。

本质上,我正在通过服务器日志正则表达式解析我将用于 运行 某些 sql 查询的特定字符串。我已经让它在不需要循环的较小规模上工作。

我需要等待所有 ppsid 到 运行 通过 _cssPPSID,它正在生成一个字典对象和我的查询过滤器,然后 运行 在查询本身中使用该过滤器进行查询然后匹配该字典以将结果与从服务器日志中解析的数据配对。

截至目前这段代码 运行s,但它在第一次迭代后停止。我假设我缺少回调或一些简单的东西,以便脚本可以返回循环。

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
  });
};