2014-10-09 60 views
-1

我試圖通過從Jenkins API中獲取數據來推送一些值到數組,如下所示。NodeJS console.log在執行FOR LOOP之前執行

buildNum = 14; 
async.waterfall([ 
function(callback){ 
for (var i = buildNum; i > (buildNum-5); i--) { 
    (function(){ 
     jenkins.build_info('BuildDefinitionRequest', i, function(err, data) { 
      if (err){ return console.log(err); } 

       var tmpObj = {}; 

       tmpObj.jobID = data.fullDisplayName; 
       tmpObj.result = data.result; 
       tmpObj.dateTime = data.id; 
       console.log(tmpObj); 

       finalArray.push(tmpObj); 

      }); 
     })(); 
    } 
    callback(null, finalArray, 1); 
    }, 
    function(finalArray, value, callback){ 
    console.log(finalArray, value); 
    callback(null, 'done'); 
    } 
    ],function(err, result){ 
    }); 

但是「callback(null,finalArray,1);」在for循環完成執行之前調用。 當我在for循環中打印「finalArray」的值時,我可以看到所有的值。

回答

3

從技術上說,for循環已經完成執行,但jenkins.build_info調用沒有。您不能在這樣的for循環中進行異步調用,並希望for循環只能在所有調用完成後才能完成。你已經在使用異步,所以這是一個簡單的修復。我會做這樣的事情:

var buildNum = 14; 
var builds = []; 

// just builds a collection for async to operate on 
for(var i = buildNum; i > (buildNum - 5); i--) { 
    builds.push(i); 
} 

var finalArray = []; 
async.each(builds, function(build, next) { 
    jenkins.build_info('BuildDefinitionRequest', build, function(err, data) { 
    if (err) { next(err); } 

    var job = { 
     jobID: data.fullDisplayName, 
     result: data.result, 
     dateTime: data.id 
    }; 

    finalArray.push(job); 
    next(); 
    }); 
}, function(err) { 
    // this won't be called until all the jenkins.build_info functional have completed, or there is an error. 
    console.log(finalArray); 
}); 
相關問題