make exec函数在forEach中逐个执行

时间:2017-04-12 09:14:10

标签: node.js

我遇到了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
...

请告诉我我错在哪里。任何帮助都会有所不同。

1 个答案:

答案 0 :(得分:2)

Array.prototype.forEach将同步执行javascript代码,无需等待异步函数完成,因此会在等待回调触发之前结束每个循环。

假设您了解async库,则应使用async.series()方法。它会完全按照你的意愿行事。阅读它here