I’m attempting to use async.js to manage callbacks in an application. Below is an example of that code. However, I’ve run into a problem where the series of functions continues executing before one of the prior functions completes. For example, the resizeImage() function is still working when saveImageData() fires. But my intention is for the image to be saved only after it is resized. Shouldn’t async.js handle this? If I have to pass a callback to resizeImage() what is the value of using async.js? Can someone show how using an async library is helpful in the example that I’ve given?
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);
}
]);
}
Most likely
saveImageDataandresizeImageare non-blocking, asynchronous calls. Given they’re doing I/O.So you call
resizeImage, it starts processing, returns control while it waits for IO, and your code immediately invokes the async.js callback that indicates that the function has finished it’s work.Instead, you should only call the async callback parameter after
saveImageDataandresizeImagecomplete, which means creating and using a callback function:You still have to ensure that the code inside each async function invokes the callback at the appropriate time.