我尝试使用此函数从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 }
});
我已经删除了日志记录和错误处理以帮助阅读。
答案 0 :(得分:0)
你的问题是:
如何在forEach循环结束时调用回调函数一次,在所有异步函数完成后完成对每个项目的工作?
回调的诀窍是不要混淆并在正确的地方做正确的事情。因为我们不在同步上下文中,所以我需要在包装器中放置额外的工作。
您的示例运行起来有点复杂。所以我构建了一个可以重用的简化示例。它只计算几个文件的行数并在结尾显示总和。
./gulpfile.js
编辑:做一些研究我发现有一个库完全符合我的要求:vaadin。值得你尝试一下: - )