【问题标题】:JS Async Directory ListingJS 异步目录列表
【发布时间】:2021-01-12 20:24:17
【问题描述】:

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

有没有办法使用这个功能,同时也制作一个目录列表的数组?

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

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

【问题讨论】:

  • 你可以learn async programming或者你可以使用readdirSync
  • 我正在尝试学习 Async,但我需要一些时间来理解。我考虑过使用同步版本,但我不想在此功能运行时占用应用程序。
  • 如果您担心性能,请使用链接评论中的异步答案。
  • 我会进一步调查。感谢您的指导。
  • 请记住,节点附带 promise based fs api。您会发现大多数异步示例都使用 promises/async-await,因此使用 fs/promises 可能更容易与类似的代码 sn-ps 进行比较

标签: javascript node.js asynchronous


【解决方案1】:

异步版本:

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

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

它将一个字符串数组(目录)映射到一个由fs.readdir 返回的promise 数组,然后在使用Array.prototype.flat 解析这些promise 的结果后将它们展平。需要展平来转换它:

[ [ "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(立即调用函数表达式),您可以使用它来测试函数,而无需先将其集成到您的代码库中。

【讨论】:

  • 这看起来很有希望。我将不得不试一试。谢谢!
  • 您在这里的帮助基本上解锁了我正在处理的其余功能。谢谢你。我不是一个经验丰富的程序员,但我正在努力学习,我已经被困在这个地狱里两天了。也帮助我澄清了一些异步原则。
  • @JohnMoran 很高兴我能帮上忙,继续努力!
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多