Javascript NodeJS Fork无法使childprocess终止
我在这里遇到了一堵墙,也许这只是一个小问题,因为我对NodeJS缺乏经验,所以我看不到解决方案 现在,我正在构建一个BT设备,它将由主应用程序控制,我已经解决了Raspberry PI 3的原型设计问题,NodeJ使用了该模块 到目前为止,一切正常,设备被找到,我可以通过蓝牙设置和获取值。但是由于循环等原因,为了将设备可以执行的不同程序从蓝牙逻辑中分离出来,我选择将这些程序提取到外部NodeJS文件中 这里的想法是使用nodejsfork模块,通过主进程控制这些进程的启动和停止 但我的问题从这里开始。我可以毫无问题地分叉不同的JavaScript文件,并执行这些文件,但我无法让它们停止,我不知道如何修复它 以下是简化的代码:Javascript NodeJS Fork无法使childprocess终止,javascript,node.js,Javascript,Node.js,我在这里遇到了一堵墙,也许这只是一个小问题,因为我对NodeJS缺乏经验,所以我看不到解决方案 现在,我正在构建一个BT设备,它将由主应用程序控制,我已经解决了Raspberry PI 3的原型设计问题,NodeJ使用了该模块 到目前为止,一切正常,设备被找到,我可以通过蓝牙设置和获取值。但是由于循环等原因,为了将设备可以执行的不同程序从蓝牙逻辑中分离出来,我选择将这些程序提取到外部NodeJS文件中 这里的想法是使用nodejsfork模块,通过主进程控制这些进程的启动和停止 但我的问题从这里
var util = require('util');
var events = require('events');
var cp = require('child_process');
...
var ProgramTypeOne = {
NONE: 0,
ProgramOne: 1,
...
};
...
var currentProgram=null;
...
function BLEDevice() {
events.EventEmitter.call(this);
...
this.currentProgram=null;
...
}
util.inherits(BLELamp, events.EventEmitter);
BLELamp.prototype.setProgram = function(programType, programNumber) {
var self = this;
var result=0;
if(programType=="ProgramTypeOne "){
if(programNumber==1){
killProgram();
this.currentProgram=cp.fork('./programs/programOne');
result=1;
}else if(programNumber==2){
...
}
self.emit('ready', result);
};
...
module.exports.currentProgram = currentProgram;
...
function killProgram(){
if(this.currentProgram!=null){
this.currentProgram.kill('SIGTERM');
}
}
变量currentProgram似乎有问题,它似乎从未从fork调用中获取childprocess。
由于除了网站上的一些小脚本外,我从未广泛使用过JavaScript,所以我不知道我的错误到底在哪里。
我认为这与类变量的处理有关
我的出发点是以布鲁诺为例
希望信息足够,有人能帮助我。
提前谢谢 由于killProgram是BLELamp范围之外的一个独立函数,因此需要通过如下方式绑定BLELamp来调用具有正确范围的killProgram。使用apply应该可以解决这个问题。我希望以下内容可以解决此问题唯一的行更改是调用killProgram的行:
作为旁注,您的代码有点混乱,因为您有一个独立的var currentProgram,然后是一对具有自己绑定this.currentPrograms的原型。我会更改名称以避免混淆。您能说出什么是BLELamp,这样我们就可以重现错误了吗?该设备是一个BLELamp,我已编辑了上面示例中的名称,但错过了BLELamp。请在这里阅读BLEDevice:我马上就来试试,谢谢。我已更改了上面示例中的名称,但感谢您的通知:…charm,我的意思是charm;
BLELamp.prototype.setProgram = function(programType, programNumber) {
var self = this;
var result=0;
if(programType=="ProgramTypeOne "){
if(programNumber==1){
killProgram.apply(this);
this.currentProgram=cp.fork('./programs/programOne');
result=1;
}else if(programNumber==2){
...
}
self.emit('ready', result);
};