Javascript 在执行FOR循环之前执行NodeJS console.log

Javascript 在执行FOR循环之前执行NodeJS console.log,javascript,node.js,asynchronous,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

我试图通过从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”的值时,我可以看到所有的值。

从技术上讲,for循环已经完成执行,但是jenkins.build\u 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);
});

从技术上讲,for循环已完成执行,但jenkins.build\u 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);
});

从技术上讲,for循环已完成执行,但jenkins.build\u 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);
});

从技术上讲,for循环已完成执行,但jenkins.build\u 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);
});