编程语言
首页 > 编程语言> > Javascript – 完成所有嵌套forEach循环后的回调

Javascript – 完成所有嵌套forEach循环后的回调

作者:互联网

我确信这是一项相当简单的任务,但此时我无法绕过它.我有一组嵌套的forEach循环,我需要在所有循环完成运行时进行回调.

我愿意使用async.js

这就是我正在使用的:

const scanFiles = function(accounts, cb) {
  let dirs = ['pending', 'done', 'failed'];
  let jobs = [];

  accounts.forEach(function(account) {
    dirs.forEach(function(dir) {
      fs.readdir(account + '/' + dir, function(err, files) {
         files.forEach(function(file) {
            //do something
            //add file to jobs array
            jobs.push(file);
         });
      });
    });
  });

  //return jobs array once all files have been added
  cb(jobs);
}

解决方法:

使用forEach的第二个参数,索引,您可以检查每次运行最内层循环时是否完成所有循环.

因此,只需在代码中添加几行就可以得到:

const scanFiles = function(accounts, cb) {
    let dirs = ['pending', 'done', 'failed'];
    let jobs = [];

    accounts.forEach(function(account, accIndex) {
        dirs.forEach(function(dir, dirIndex) {
            fs.readdir(account + '/' + dir, function(err, files) {
                files.forEach(function(file, fileIndex) {
                    //do something
                    //add file to jobs array
                    jobs.push(file);

                    // Check whether each loop is on its last iteration
                    const filesDone = fileIndex >= files.length - 1;
                    const dirsDone = dirIndex >= dirs.length - 1;
                    const accsDone = accIndex >= accounts.length - 1;

                    // all three need to be true before we can run the callback
                    if (filesDone && dirsDone && accsDone) {
                        cb(jobs);
                    }
                });
            });
        });
    });
}

标签:async-js,javascript,node-js
来源: https://codeday.me/bug/20190823/1700849.html