我使用以下代码创建子进程,该进程按预期工作,我现在想要做的是在进程结束时杀死它,我尝试用最后一个(如果我把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]
如何克服这个问题并最终终止这个过程
答案 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.
});
所有未经测试的,所以要做好适应/修复的准备。