在承诺结束时杀死孩子的过程

时间:2015-08-05 12:16:11

标签: javascript promise bluebird child-process

我使用以下代码创建子进程,该进程按预期工作,我现在想要做的是在进程结束时杀死它,我尝试用最后一个(如果我把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]

如何克服这个问题并最终终止这个过程

2 个答案:

答案 0 :(得分:0)

根据要求,举例:

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

答案 1 :(得分:0)

据我所知,宣传require('child_process').exec本身并不正确。最好的情况是,你最终会得到一个返回一个promise的函数,但你会直接拒绝对子进程本身的引用。需要一些想象力。

您可以在require('child_process').exec(cmd, callback)包装器内以正常方式调用new Promise(),然后严格地解决/拒绝,以便在promise链下提供对子进程的引用

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

首先是一对或要求:

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

正如所写,这个promisifier足够灵活,可以满足各种child_process方法。只需传递(或绑定)'产生',' 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.
    });

所有未经测试的,所以要做好适应/修复的准备。