【问题标题】:How to Array.map chain off of async await?如何从异步等待中断开 Array.map 链?
【发布时间】:2019-05-17 21:43:23
【问题描述】:

如何在等待的情况下运行 Array.map?

const CLASS_PATH = 'User/matt/Github/project';
const PACKAGE_JSON = 'package.json';

const walk = async path => {
  let dirs = [];
  for (const file of await readdir(path)) {
    if ((await stat(join(path, file))).isDirectory()) {
      dirs = [
        ...dirs,
        file,
      ];
    }
  }
  return dirs;
};


async function main() {
  const packagePaths = await walk(CLASS_PATH)
        .map(pkgName => join(CLASS_PATH, pkgName, PACKAGE_JSON));

}
main();

【问题讨论】:

  • 为什么不只是dirs.push(file)
  • 我想你会发现this Q&A相关
  • @MatthewHarwood,请问您希望main 做什么?您是否要查找给定目录中所有package.json 文件的路径?

标签: javascript arrays asynchronous functional-programming async-await


【解决方案1】:

括号() 总是可以用来改变运算符的优先级:

 (await walk(CLASS_PATH)).map(/*...*/)

【讨论】:

  • 你太棒了
  • 我很惊讶你不知道这一点,你实际上已经在 你的代码中使用了它
  • 因为我复制和粘贴了一个walk函数>_
【解决方案2】:

你也可以使用 Promise。 所以在你的情况下:

const packagePaths = await Promise.all(walk(CLASS_PATH).map(async (item): Promise<number> => {
    await join(CLASS_PATH, pkgName, PACKAGE_JSON);
}));

Promise.all(iterable) 方法返回一个承诺,当 可迭代参数中的所有承诺都已解决或拒绝 第一个通过的 promise 被拒绝的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2018-08-13
    • 2017-03-01
    相关资源
    最近更新 更多