【问题标题】:async await with nested dependent Promise call带有嵌套依赖 Promise 调用的异步等待
【发布时间】:2018-11-04 17:27:22
【问题描述】:

我正在尝试更多地了解 async、await Promises 和所有这些,我已经理解了它背后的概念,但是当涉及到这些 Promise 的嵌套逻辑时我遇到了麻烦。 理论上我的理解是整个 async await 会让你的代码看起来更加同步,这意味着所有期望 promise 的结果都是你使用 await 的结果。 这段代码的主要目标是从来自 readdirPromisify 的目录+文件列表中返回,过滤并只给我一个文件列表。使用 stat.isFile()。 如果有人可以提供帮助,我将不胜感激。谢谢!

const fs = require("fs");
const { exec } = require("child_process");
const { promisify } = require("util");
const [, , ...args] = process.argv;
const isOptionDirectory = promisify(fs.stat);
const readdirPromisify = promisify(fs.readdir);
const [packageName] = args;

const test = async function() {
  const dirs = await readdirPromisify(__dirname);
  const files = await dirs.filter(async file => {
    const option = await isOptionDirectory(file);
    return option.isFile();
  });
  return files;
};

console.log(test().then(val => console.log(val)));

【问题讨论】:

  • filter() 不知道承诺,这意味着它不关心您传递给它的回调是否返回承诺并且不会等待它完成异步方法

标签: javascript node.js async-await


【解决方案1】:

filter 不支持承诺。 async function 返回的 Promise 将被视为真值。

你会想要使用Promise.all:

async function test() {
  const paths = await readdirPromisify(__dirname);
  const options = await Promise.all(paths.map(isOptionDirectory));
  return paths.filter((_, i) => options[i].isFile());
}

【讨论】:

  • 漂亮.. 感谢您的回复。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2018-06-04
  • 2018-06-25
  • 2020-10-17
相关资源
最近更新 更多