【问题标题】:NodeJS console.log executing before executing the FOR LOOPNodeJS console.log 在执行 FOR LOOP 之前执行
【发布时间】:2014-10-09 22:38:27
【问题描述】:

我正在尝试通过从 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){
  });

但是“回调(null, finalArray, 1);”在 for 循环完成执行之前被调用。 当我在 for 循环中打印“finalArray”的值时,我可以看到所有的值。

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    从技术上讲,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);
    });
    

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 2018-05-23
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2021-06-25
      相关资源
      最近更新 更多