Async.each:所有执行后只有一个回调

时间:2017-07-18 11:20:39

标签: node.js express asynchronous async.js

我对订单中的以下内容有一个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

可以上传所有内容后显示成功消息

3 个答案:

答案 0 :(得分:2)

Async.each采取第三个增强:

A callback which is called when all iteratee functions have finished, 
or an error occurs. Invoked with (err).

您需要设置第三个参数,以了解所有上传时间是否已完成或某些上传失败。

https://caolan.github.io/async/docs.html#each

答案 1 :(得分:2)

(1)当您一般工作async.js时,您应始终在任务完成时或甚至在出现错误时触发回调,即cb。对于每项任务,它也应该是一次而不是更多。如果您没有在同一任务中触发或触发它,您的代码可能会挂起或者您将分别收到错误。

(2)async.each有3个参数:colliterateecallback。您只使用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中,除了复杂的代码,你不会知道每个“每个”都运行良好