首页 > 解决方案 > JS 异步目录列表

问题描述

我试图遍历包含目录的数组,然后返回所有项目的组合数组,而不管目录的数量。我试图使用 fs.readdir 函数来读取目录,但是看到 fs.readdir 函数是一个异步函数,我无法将信息传回其中。

有没有办法使用这个功能,而且还制作一个目录列表数组?

这是我想做的,但我知道这是错误的。希望能得到一点指导。我可以提供任何其他信息。谢谢你。

var docs = [];
libs.forEach(function(lib){
    fs.readdir(lib, function(err, files){
        files.forEach(function(file){
            docs.push(file);
        });
    });
});

标签: javascriptnode.jsasynchronous

解决方案


异步版本:

const fs = require("fs/promises");

function listDirectories(dirs) {
  return Promise.all(dirs.map(dir => fs.readdir(dir))).then(files => files.flat());
}

它将字符串数组(目录)映射到由 . 返回的 promise 数组fs.readdir,然后在使用Array.prototype.flat. 需要展平来转换它:

[ [ "file1" ], [ "file2", "file3" ] ]进入[ "file1", "file2", "file3" ].

然后,async您可以从一个函数中调用它,如下所示:

(async () => {
  const dirs = ["one", "two", "three"];
  try {
    let files = await listDirectories(dirs);
    console.log(files);
  } catch (e) {
    console.error(e);
  }
})();

请注意,上面是一个IIFE(立即调用函数表达式),您可以使用它来测试函数,而无需先将其集成到您的代码库中。


推荐阅读