首页 > 解决方案 > 如何将 klaw 与 async/await 一起使用?

问题描述

我正在尝试以递归方式获取目录中所有Java文件的列表。我正在尝试使用Klaw,但我似乎无法使用它async/await

const files: string[] = [];
await klaw(myDir, { 
    filter: (item: any) => { return path.extname(item.path) === ".java"; }
}).on("data", (item) => { files.push(item.path); });

if (!files.length)
    console.log("Directory contains no java files");

但是,我在过滤函数完成之前打到了底部的 if 语句。我不知道如何纠正它。

标签: node.jsasync-await

解决方案


假设您的代码在函数内部正确运行async。您可以执行以下操作

// this code should be inside async function to use await keyword
const run = async () => {
  const files: string[] = await new Promise<string[]>((resolve, reject) => {
    const files: string[] = [];
    klaw(myDir, {
      filter: (item: any) => {
        return path.extname(item.path) === ".java";
      }
    })
      .on("data", item => {
        files.push(item.path);
      })
      .on("end", () => resolve(files))
      .on("error", reject);
  });

  if (!files.length) console.log("Directory contains no java files");
};

或者使用一些为你做的包。例如流到承诺

游乐场链接


推荐阅读