在 FOR 循环后执行 FS 动作

Execute after FOR loop with FS action

我有一个 for 循环,它在 fs.copy 之后调用一个动作。 for循环完成后,我需要执行一个命令。我想我需要在 for 完成后进行回调。我认为我 运行 遇到的问题是 fs.copy 是 运行 异步的,因此 for 循环实际上在 fs.copy 操作完成之前完成。建议?

var sessionNumeber = 7;
photoOrder = (An array of photo names);
for(var i = photoOrder.length - 1; i >= 0; i--) {
    console.log('Moving Photo');
    fs.copy(cfg.watchedFolder+photoOrder[i]+'.jpg', cfg.outputFolder+sessionNumber+"/"+i+'.jpg', function (err) {
        if (err) {
            // i.e. file already exists or can't write to directory 
            throw err;
        }
    });
});
nextCommand();

因为 for 循环不是异步的而 copy 是异步的,所以你不能使用 for 循环异步函数。解决方案是使用 async 库。

https://github.com/caolan/async

async.map(arr, iteratee, [callback])

比如你可以试试:

async.map(photoOrder, function (photo, callback) {
    console.log('Moving Photo');
    fs.copy(cfg.watchedFolder + photo + '.jpg', cfg.outputFolder + sessionNumber + "/" + i + '.jpg', function (err) {
        if (err) {
            // i.e. file already exists or can't write to directory 
            callback(err);
        }
    });
}, function (err, results) {

    nextCommand();
});