我正在尝试使用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);
}
]);
}
答案 0 :(得分:1)
最有可能saveImageData
和resizeImage
是非阻塞的异步调用。鉴于他们正在进行I / O.
所以你调用resizeImage
,它开始处理,在等待IO时返回控制,你的代码立即调用async.js回调,指示函数已完成它的工作。
相反,您应该只在saveImageData
和resizeImage
完成后调用异步回调参数,这意味着创建和使用回调函数:
// this is just a guess at the api.
async.series[function(callback) {
model.resizeImage(src,dst,function() {
callback(null);
});
}];
您仍然必须确保每个异步函数中的代码在适当的时间调用回调。