使用 promise.all() 验证环境

Verify environment using promise.all()

我必须使用 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() 并且请任何人可以告诉我如何做的例子?

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

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

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);
})();