我对订单中的以下内容有一个async.each
函数。
1.从数组中获取图像大小。
2.Crop the image。
3.上传到AWS s3。
现在我想在所有上传后显示单个成功消息。
async.each(crop_sizes,function (result,cb) {
//crop image
gm(path)
.resize(result.width, result.height,'^')
.crop(result.width, result.height)
.stream(function (err,buffer) {
//upload to s3
s3.upload(params,function(err,success){
if(!errr){
conseole.log(uploaded);
}
})
});
});
输出如
uploaded
uploaded
uploaded
uploaded
但是我希望在async
答案 0 :(得分:2)
Async.each采取第三个增强:
A callback which is called when all iteratee functions have finished,
or an error occurs. Invoked with (err).
您需要设置第三个参数,以了解所有上传时间是否已完成或某些上传失败。
答案 1 :(得分:2)
(1)当您一般工作async.js
时,您应始终在任务完成时或甚至在出现错误时触发回调,即cb
。对于每项任务,它也应该是一次而不是更多。如果您没有在同一任务中触发或触发它,您的代码可能会挂起或者您将分别收到错误。
(2)async.each有3个参数:coll
,iteratee
,callback
。您只使用2.完成所有任务后,将触发最后一个参数callback
。
async.each(crop_sizes, function task(result, cb) {
//crop image
gm(path)
.resize(result.width, result.height, '^')
.crop(result.width, result.height)
.stream(function (err, buffer) {
if (err)
return cb(err); // we use 'return' to stop execution of remaining code
//upload to s3
s3.upload(params, function(err,success){
if (err)
return cb(err);
cb(null, success);
});
// you could also simply do s3.upload(params, cb);
});
}, function allTasksAreDone (err) {
if (err)
console.log(err);
// do something now
});
(3)我认为如果你想得到每项任务的结果,你最好使用async.map。这是一个example。唯一的区别是,您的callback
会有一个额外的参数,这是一个包含所有success
es的数组。
答案 2 :(得分:-2)
我认为您应该尝试等待每次“每次”返回,然后等待console.log,如果您认为一切正常。在你的async.each中,除了复杂的代码,你不会知道每个“每个”都运行良好