【问题标题】:How to use node's child_process.exec() with promises如何将节点的 child_process.exec() 与 promise 一起使用
【发布时间】:2018-10-24 06:00:06
【问题描述】:

我尝试使用 node.js(docker exec 命令)顺序执行长进程。

我愿意:

const childProcess = require('child_process');

const execWithPromise = async command => {
    return new Promise(async resolve => {
        const process = childProcess.exec(command);

        process.on('exit', err => resolve(err));
        process.on('close', err => resolve(err));
    });
};

const run = async () => {
    await execWithPromise('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
    await execWithPromise('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
};

run();

但是承诺会立即得到解决,结果为 1。在这两种情况下。该命令在命令行上运行正常。

为什么会立即返回?

【问题讨论】:

标签: node.js exec child-process


【解决方案1】:

child_process.exec 期望回调作为第二个或第三个参数。它不返回承诺。根据您的用例和节点版本,您有几个选择。

使用回调并返回解析。

return new Promise(async resolve => {
     childProcess.exec(command, (err, stout, sterr) {
        resolve(err ? stout : sterr)
      }
  });

改用 spawn(保留大部分代码)

const execWithPromise = async command => {
    return new Promise(async (resolve, reject) => {
        const process = childProcess.spawn(command);
        process.on('data', data => resolve(data));
        process.on('error', err => reject(err));
        process.on('close', err => reject(err));
    });
};

将 execSync 与 try catch 一起使用

return new Promise(async (resolve, reject) => {
    try {
        resolve(childProcess.execSync(command));
    } catch(error) {
      reject(error) 
    }
});

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但这是我不久前在 node 中发现的一个有用的工具......所以,假设你有一个 node 文件 app.ts,在 typescript 中......

    app.ts

    import utils from 'util'; // The thing that is useful, it has a bunch of useful functions
    import { exec } from 'child_process'; // The exec import
    
    export function execute(command: string): Promise<any> {
        // Not too concerned about the return type here
        return utils.promisify(exec)(command);
    }
    
    const run = async () => {
        await execute('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
        await execute('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
    };
    
    run();
    

    在 js 中虽然可能是这样的

    app.js

    const utils = require('util');
    const exec = require('child_process').exec;
    
    function execute(command) {
        return utils.promisify(exec)(command);
    }
    
    const run = async () => {
        await execute('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
        await execute('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
    };
    
    run();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2015-11-30
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多