在承诺结束时杀死子进程
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。
我使用以下代码创建子进程,该进程按预期工作,我现在想做的是在进程结束时将其杀死,我尝试使用最后一个 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。