为什么这个async.js系列不同步

时间:2012-11-10 19:20:40

标签: javascript asynchronous

我正在尝试使用async.js来管理应用程序中的回调。以下是该代码的示例。但是,我遇到了一系列函数在其中一个先前函数完成之前继续执行的问题。例如,当saveImageData()触发时,resizeImage()函数仍然有效。但我的目的是让图像在调整大小后才能保存。不应该async.js处理这个?如果我必须将回调传递给resizeImage(),使用async.js的价值是什么?有人能说明在我给出的例子中,使用异步库是如何有用的吗?

    if (req.files) {

        //removed some code not relevant to the question

        async.series([

            function (callback) {
                model.saveImageData(tempPath, originalImage, s3Headers);

                callback(null);
            },

            function (callback) {

                var src = tempPath;
                dst = path.dirname(tempPath) + "\\" + newImage;
                model.resizeImage(src, dst);

                callback(null);
            },

            function (callback) {
                //the next function gets called before resizeImage() finishes executing
                model.saveImageData(dst, newImage, s3Headers);

                callback(null);
            }
        ]);

    }

1 个答案:

答案 0 :(得分:1)

最有可能saveImageDataresizeImage是非阻塞的异步调用。鉴于他们正在进行I / O.

所以你调用resizeImage,它开始处理,在等待IO时返回控制,你的代码立即调用async.js回调,指示函数已完成它的工作。

相反,您应该只在saveImageDataresizeImage完成后调用异步回调参数,这意味着创建和使用回调函数:

// this is just a guess at the api.
async.series[function(callback) {

  model.resizeImage(src,dst,function() {
       callback(null);
  });

}];

您仍然必须确保每个异步函数中的代码在适当的时间调用回调。