0

我正在尝试使用 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);
            }
        ]);

    }
4

1 回答 1

1

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

因此,您调用resizeImage,它开始处理,在等待 IO 时返回控制权,并且您的代码立即调用 async.js 回调,表明该函数已完成工作。

saveImageData相反,您应该只在 after和complete调用异步回调参数resizeImage,这意味着创建和使用回调函数:

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

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

}];

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

于 2012-11-10T19:28:36.147 回答