nodejs foreach没有返回正确的值

时间:2018-01-24 18:24:43

标签: node.js asynchronous amazon-s3 foreach

我尝试使用此函数从s3中的日志文件中获取一些总计数,然后将它们添加到总变量中以便返回。但我无法正确回调。

我已经在foreach循环结束时尝试了回调,并且还在" 别的"最后,但在任何一种情况下,totalRowCount始终为零bcz语句立即开始执行。不知道我做错了什么,谢谢你的帮助。

function getRowCount2(token, params, callback){
  var totalRowCount = 0,
    TextDecoder = textEncoding.TextDecoder,
    i = 0;
  if(token) params.ContinuationToken = token;

  s3.listObjectsV2(params, function(err, data){

      i = data.Contents.length;
      data.Contents.forEach(function(file, index) {            

          s3.getObject({Bucket: params.Bucket, Key: file.Key}, function(err, data) {

              zlib.gunzip(data.Body, function (err, result) {
                    var extractedData = JSON.parse(new TextDecoder("utf-8").decode(result));
                    totalRowCount = totalRowCount + parseInt(extractedData.rowcount, 10);

              });

              if ((index+1) == i){
                console.log('callback ' + totalRowCount);
                return callback('', totalRowCount);
              }
          });

       });

    if(data.IsTruncated)
      getRowCount2(data.NextContinuationToken, params, callback);
    else          
      //return callback('', totalRowCount);
  });
}

getRowCount2('', params, function(error, data) {
     // check if equal
     if (mycount == data) { //success }
  });

我已经删除了日志记录和错误处理以帮助阅读。

1 个答案:

答案 0 :(得分:0)

你的问题是:

  

如何在forEach循环结束时调用回调函数一次,在所有异步函数完成后完成对每个项目的工作?

回调的诀窍是不要混淆并在正确的地方做正确的事情。因为我们不在同步上下文中,所以我需要在包装器中放置额外的工作。

您的示例运行起来有点复杂。所以我构建了一个可以重用的简化示例。它只计算几个文件的行数并在结尾显示总和。

./gulpfile.js

编辑:做一些研究我发现有一个库完全符合我的要求:。值得你尝试一下: - )