2016-12-26 4 views
0

Ok. Also bin ich extrem neu im Knoten. Mein Verstand dreht sich gerade in der Callback-Hölle. Ich habe viele ähnliche Fragen durchgelesen, aber es scheint nicht zu funktionieren.Node.js muss auf die Ausführung der Schleife warten, bevor die Funktion ausgeführt wird

im Wesentlichen, Parsing durch Server-Logs regex'ing für bestimmte Zeichenfolgen, die ich verwenden werde, um einige SQL-Abfragen mit auszuführen. Ich habe das in einem kleineren Maßstab arbeiten lassen, wo eine Schleife nicht benötigt wird.

Ich muss warten, bis alle ppsids durch _cssPPSID laufen, was ein Wörterbuchobjekt und meinen Abfragefilter generiert, bevor eine Abfrage ausgeführt wird, die diesen Filter in der Abfrage selbst verwendet und dann mit diesem Wörterbuch abgleicht, um die Ergebnisse zu paaren mit den Daten, die von den Serverprotokollen analysiert werden.

Im Moment wird dieser Code ausgeführt, aber es stoppt nach der ersten Iteration. Ich nehme an, dass ich einen Callback oder etwas einfaches vermisse, damit das Skript zur Schleife zurückkommen kann.

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

Antwort

1

Ihre async.eachSeries wird nicht funktionieren, weil Funktion _cssPPSID keinen Rückruf als zweites Argument nehmen, so dass die next() nie aufgerufen.

Versuchen Sie es wie folgt umschreiben:

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