2016-12-26 16 views
0

Ok。だから私は非常にノードに新しいです。私の心はコールバック地獄で今回転しています。私は多くの同様の質問を読んだが、それが正しく動作するように見えることはできません。Node.jsはループを終了してから関数を実行するまで待つ必要があります

本質的に、私はいくつかのSQLクエリを実行するために使用する特定の文字列の正規表現です。ループが必要ない小規模な環境で動作するようになってきました。

クエリ自体でそのフィルタを使用してクエリを実行してから、その辞書と照合して結果をペアリングする前に、辞書オブジェクトとクエリフィルタを生成する_cssPPSIDをすべてのppsidが実行するまで待つ必要がありますサーバーログからデータを解析します。

現在のところ、このコードは実行されていますが、最初の反復後に停止します。私は、スクリプトがループに戻ることができるように、私はコールバックや何かが欠けていると推定しています。

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

答えて

1

あなたasync.eachSeriesnext()が呼び出されないように、機能_cssPPSIDは、第二引数としてコールバックを取ることはありませんので動作しません。

このようにそれを書き換えてみます

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 
    }); 
}; 
関連する問題