我遇到了nodejs的异步问题。
我想调整文件夹中的图像大小,resize
是一个可执行的二进制文件。
问题是我的resize
无法同时执行多次。所以我使用Array.prototype.forEach而不是async.forEach来期望每个文件将被逐个处理。
var exec = require('child_process').exec;
exec('ls ' + IMAGE_FOLDER, function (error, stdout, stderr) {
if (error) {throw error;}
var fileList = stdout.split("\n");
fileList.pop(); //Remove the last element that null
fileList.forEach(function(imageFile, index, array) {
var inFile = IMAGE_FOLDER + imageFile;
console.log(inFile);
exec('resize ' + inFile, function(err, stdout, stderr){
if (err) {
console.log(stderr);
throw err;
}
console.log('resized ' + imageFile );
})
});
});
但我得到的结果是我的代码的行为是无块的,它打印出来:
image1
image2
...
resized image1
resized image2
...
我预计打印输出的行为应该是:
image1
resize image1
image2
resize image2
...
请告诉我我错在哪里。任何帮助都会有所不同。
答案 0 :(得分:2)
Array.prototype.forEach
将同步执行javascript代码,无需等待异步函数完成,因此会在等待回调触发之前结束每个循环。
假设您了解async
库,则应使用async.series()
方法。它会完全按照你的意愿行事。阅读它here。