我使用以下代码创建子进程,该进程按预期工作,现在我想要做的是在该进程的末尾杀死它,然后尝试使用最后一个(如果我把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]
如何克服这个问题并最终终止进程
据我所知,自我传播require('child_process').exec
是不正确的。充其量,您最终会得到一个返回诺言的函数,但是直接地,您将被拒绝对子进程本身的引用。需要一些想象力。
您可以require('child_process').exec(cmd, callback)
在new Promise()
包装器内以常规方式进行调用,并且至关重要的是,可以通过在promise链中提供对子流程的引用来进行解析/拒绝。
我不确定Bluebird的.promisify()
灵活性是否足以胜任这项工作,因此这里有一个手动说明。
首先,一对夫妇或要求:
var Promise = require('bluebird');
var child_process = require('child_process');
现在,手动promisifier:
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.
}
});
});
}
如前所述,这个承诺器足够灵活,可以满足各种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.
});
所有未经测试,因此请做好适应/修复的准备。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句