【问题标题】:Execute after FOR loop with FS action在使用 FS 操作的 FOR 循环之后执行
【发布时间】:2016-02-26 09:58:06
【问题描述】:

我有一个 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();

【问题讨论】:

  • 请格式化您的代码
  • 代码已更新
  • 为照片添加计数器,当它等于数组的长度时 - 调用你的函数
  • 不,那不是有效的 js。
  • @loadaverage 确实有一个如何做到这一点的例子。我试图在 fs.copy 回调中添加一个,但无法让它工作。

标签: javascript node.js fs fs-extra


【解决方案1】:

因为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();
});

【讨论】:

  • 它似乎正在运行 nextCommand();在每次迭代之后,而不是在一切都完成之后。想法?
  • 不,所有完成后运行最后一个函数。更多信息:github.com/caolan/async#map
  • 啊,你的代码中看起来像是一个错字,在 "},function(err, results){" 之前缺少 "})" 如果你想修复它,我可以将其标记为正确。
  • 对不起,我错过了错字。我刚更新。你试过了吗?
  • 我试了一下,它运行良好。但是如果我第二次尝试运行它,nextCommand 就不会运行。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多