NodeJS console.log在执行FOR LOOP之前执行

时间:2014-10-09 13:33:23

标签: javascript node.js asynchronous

我试图通过从Jenkins API获取数据来将一些值推送到数组,如下所示。

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”的值时,我能够看到所有的值。

1 个答案:

答案 0 :(得分: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);
});