-3

我必须使用 promise.all() 编写 Node.js 脚本来检查环境是否有 docker、git、npm、nvm 和 node.js。对于每个工具,将工具版本写入标准输出。如果某些工具不存在,请写入有关它的 stderr 消息并使用正确的退出代码完成过程。

我的代码如下所示:

const util = require("util");

const exec = util.promisify(require("child_process").exec);

async function getVersion(env) {
  try {
    const { stdout } = await exec(env);
    console.log(stdout);
  } catch (error) {
    console.error(error.stderr);
  }
}

(async function () {
  const fileVersion = [
    "node --version",
    "docker --version",
    "nvm version",
    "git --version",
    "npm --version",
  ];
  const results = await Promise.all(fileVersion);

  for (const element of results) {
    getVersion(element);
  }
})();

我知道在该代码中 promise.all() 没有发挥任何作用,我不熟悉 promise.all() 并且请任何人都可以向我展示如何做到这一点的示例?

4

1 回答 1

0

Promise.all()方法实际上将一个可迭代的 Promise 作为输入(在您的代码中,您只是传递一个字符串数组),并返回一个 Promise,该 Promise 解析为传递给函数的输入 Promise 的结果数组。当所有传递的承诺都已解决(或者如果传递的可迭代不包含与您的情况类似的承诺),此返回的承诺将解决。它还会在任何传递的输入 promise 被拒绝或 non-promise 抛出错误时立即拒绝,并且将拒绝第一个拒绝消息/错误。

如果您想真正从该Promise.all()方法中受益,您需要向它传递一个 Promise 数组,而不是您现在传递的字符串数组。

const util = require("util");

const exec = util.promisify(require("child_process").exec);

async function getVersion(env) {
  try {
    const { stdout } = await exec(env);
    console.log("env is" + stdout);
    return stdout;
  } catch (error) {
    console.error(error.stderr);
  }
}

(async function () {
  const fileVersion = [
    "node --version",
    "docker --version",
    "nvm version",
    "git --version",
    "npm --version",
  ];
  const results = await Promise.all(fileVersion.map(x => getVersion(x)));
  console.log(results);
})();
于 2021-12-06T10:51:36.507 回答