2014-10-09 33 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); 
}); 
相关问题