在承诺结束时杀死子进程

Kill child process at the end of promise

我使用以下代码创建子进程,该进程按预期工作,我现在想做的是在进程结束时将其杀死,我尝试使用最后一个 then(如果我将 BP它在该过程完成后停在那里)我的问题是如何正确地杀死它并避免这个错误。

getCmd 向 运行 提供命令,这按预期工作

var childProcess = Promise.promisify(require('child_process').exec);

....
            .then(getCmd)
            .then(childProcess)
            .spread(function (stdout, stderr) {
                console.log(stdout, stderr);
                return stdout;
            }).then(function(){

                childProcess.kill()
            })

当执行行 childProcess.kill() 时,我得到了错误:

[TypeError: undefined is not a function]

如何克服这个问题并在最后终止进程

应要求,举例:

var childProcess = require('child_process').exec;
var childPromise = Promise.promisify(childProcess);

....
childPromise
            .then(getCmd)
            .then(childPromise) // not sure if you want the promise or process here
            .spread(function (stdout, stderr) {
                console.log(stdout, stderr);
                return stdout;
            }).then(function(){

                childProcess.kill() // as returned by require(...).exec
            })

据我所知,承诺 require('child_process').exec 本身是不正确的。充其量,您最终会得到一个 returns 承诺的函数,但您会直接被拒绝对子进程本身的引用。需要一些想象力。

您可以在 new Promise() 包装器内以正常方式调用 require('child_process').exec(cmd, callback),并且关键的是,resolve/reject 的调用方式使得对子进程的引用可用沿着承诺链向下。

我不确定 Bluebird 的 .promisify() 是否足够灵活来完成这项工作,所以这里是手动 promisification。

先一对或要求:

var Promise = require('bluebird');
var child_process = require('child_process');

现在是手动承诺器:

function childProcessPromise (method, cmd) {
    return new Promise(function(resolve, reject) {
        var child = child_process[method](cmd, function(error, stdout, stderr) {
            if(error !== null) {
                error.child = child;//monkeypatch the error with a custom .child property.
                reject(error);
            } else {
                resolve({ 'child':child, 'stdout':stdout, 'stderr':stderr });//all available data bundled into a single object.
            }
        });
    });
}

正如所写,这个 promifier 足够灵活,可以满足各种 child_process 方法的需要。只需传递(或绑定)'spawn'、'exec'、'execFile' 或 'fork' 作为第一个参数。

您的承诺链将如下所示:

....
    .then(getCmd)
    .then(childProcessPromise.bind(null, 'exec'))
    .then(function(result) {
        // result.child, result.stdout and result.stderr are available here.
    }, function(error) {
        //error is available here, including its custom .child property.
    });

全部未经测试,所以请做好准备adapt/fix。