如何将promisify()与spawn()函数一起使用the child_process的spawn()函数?

发布于 2025-02-12 18:28:24 字数 584 浏览 0 评论 0 原文

我有以下代码示例,现在我有关于如何使用 utils.promisify(); 仅使用 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);
});

第二个代码示例正常工作。

const promisifiedExecFile = promisify(child_process.execFile);

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

test();

I have the following code example, and I have now ideas on how to resolve this using utils.promisify(); ONLY! Not Promise!

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

The second code example works fine.

const promisifiedExecFile = promisify(child_process.execFile);

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

test();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

在风中等你 2025-02-19 18:28:24

我无法快速找出为什么 Promisify 函数与 Spawn 函数无法正常工作。但是您可以这样创建自己的尊贵功能:

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

js

const { spawn: spwn } = require('child_process');

const spawn = (
  cmd,
  args,
) => new Promise((resolve, reject) => {
  const cp = spwn(cmd, args);
  const error = [];
  const stdout = [];
  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);
  }
})();


I couldn't quickly find out why the promisify function does not work properly with the spawn function. But you can create your own promisify function like this:

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

JS

const { spawn: spwn } = require('child_process');

const spawn = (
  cmd,
  args,
) => new Promise((resolve, reject) => {
  const cp = spwn(cmd, args);
  const error = [];
  const stdout = [];
  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);
  }
})();


弱骨蛰伏 2025-02-19 18:28:24

Node.js的内置UTIL软件包具有 Promisify()函数,可将基于回调的函数转换为基于承诺的函数。这使您可以使用基于回调的API使用承诺链式和异步/等待。

我认为我们不能将 promisify() spawn()函数一起使用。
例如,我们可以将 Promisify() execfile()而不是 spawn()::

async asyncExecFile(tool) {
        const execFile = util.promisify(child_process.execFile);

        return await execFile(tool, ['--version'])
            .catch(() => {
                this.printError(`The "${tool}" don't exist in the current environment. \n`);
                process.exit(0);
            });
}

Node.js' built-in util package has a promisify() function that converts callback-based functions to promise-based functions. This lets you use promise chaining and async/await with callback-based APIs.

I think that we can't use the promisify() with the spawn() function.
For example we can use promisify() with execFile() instead of spawn():

async asyncExecFile(tool) {
        const execFile = util.promisify(child_process.execFile);

        return await execFile(tool, ['--version'])
            .catch(() => {
                this.printError(`The "${tool}" don't exist in the current environment. \n`);
                process.exit(0);
            });
}
峩卟喜欢 2025-02-19 18:28:24

这是不可能的,因为没有什么可以 prosisify prosisify 在函数上工作,在该功能上进行回调,而 spawn 不接听回调。

您使用 Spawn 通过取返回的 childprocess 然后将侦听器添加到 childprocess '可读流( stdout stderr , stdio ...)

Omar Omeiri的答案与如何 execfile >,因此您可以改用Promisified execfile 。 (如果您需要无限的缓冲区,请传递 MaxBuffer:Infinity 内部选项)

It is not possible because there is nothing to promisify. promisify works on functions where it takes a callback and spawn does not take a callback.

You use spawn by taking the returned ChildProcess then adding listeners to the ChildProcess' readable streams (stdout, stderr, stdio...)

Omar Omeiri's answer is similar to how execFile works inside node itself, so you can just use the promisified execFile instead. (if you need unlimited buffer, pass in maxBuffer: Infinity inside options)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文