如何将 promisify() 与 spawn() 函数一起用于“child_process”?

POM*_*IUK 3 spawn child-process node.js

我有以下代码示例,现在我有了关于如何utils.promisify();仅使用解决此问题的想法!不承诺!

const spawn = child_process.spawn('docker', ['--version']);

spawn.stdout.on('data', (data) => {
   process.stdout.write(data);
});

spawn.on('error', () => {
   process.stderr.write(error);
   process.exit(1);
});
Run Code Online (Sandbox Code Playgroud)

第二个代码示例运行良好。

const promisifiedExecFile = promisify(child_process.execFile);

async function test() {
  const version = await promisifiedExecFile('docker', ['--version']);
  console.log(version);
}

test();
Run Code Online (Sandbox Code Playgroud)

Oma*_*iri 5

我无法快速找出为什么该promisify函数现在可以与该spawn函数正常工作。但是你可以创建自己的 promisify 函数,如下所示:

TS

import { spawn as spwn } from 'child_process';

const spawn = (
  cmd: string,
  args: ReadonlyArray<string>,
) => new Promise((resolve, reject) => {
  const cp = spwn(cmd, args);
  const error: string[] = [];
  const stdout: string[] = [];
  cp.stdout.on('data', (data) => {
    stdout.push(data.toString());
  });

  cp.on('error', (e) => {
    error.push(e.toString());
  });

  cp.on('close', () => {
    if (error.length) reject(error.join(''));
    else resolve(stdout.join(''));
  });
});

(async () => {
  try {
    const stdOut = await spawn('docker', ['--version']);
    console.log('stdOut: ', stdOut);
  } catch (error) {
    console.log('error:', error);
    process.exit(1);
  }
})();

Run Code Online (Sandbox Code Playgroud)

JS

import { spawn as spwn } from 'child_process';

const spawn = (
  cmd: string,
  args: ReadonlyArray<string>,
) => new Promise((resolve, reject) => {
  const cp = spwn(cmd, args);
  const error: string[] = [];
  const stdout: string[] = [];
  cp.stdout.on('data', (data) => {
    stdout.push(data.toString());
  });

  cp.on('error', (e) => {
    error.push(e.toString());
  });

  cp.on('close', () => {
    if (error.length) reject(error.join(''));
    else resolve(stdout.join(''));
  });
});

(async () => {
  try {
    const stdOut = await spawn('docker', ['--version']);
    console.log('stdOut: ', stdOut);
  } catch (error) {
    console.log('error:', error);
    process.exit(1);
  }
})();

Run Code Online (Sandbox Code Playgroud)