Javascript NodeJS Fork无法使childprocess终止

Javascript NodeJS Fork无法使childprocess终止,javascript,node.js,Javascript,Node.js,我在这里遇到了一堵墙,也许这只是一个小问题,因为我对NodeJS缺乏经验,所以我看不到解决方案 现在,我正在构建一个BT设备,它将由主应用程序控制,我已经解决了Raspberry PI 3的原型设计问题,NodeJ使用了该模块 到目前为止,一切正常,设备被找到,我可以通过蓝牙设置和获取值。但是由于循环等原因,为了将设备可以执行的不同程序从蓝牙逻辑中分离出来,我选择将这些程序提取到外部NodeJS文件中 这里的想法是使用nodejsfork模块,通过主进程控制这些进程的启动和停止 但我的问题从这里

我在这里遇到了一堵墙,也许这只是一个小问题,因为我对NodeJS缺乏经验,所以我看不到解决方案

现在,我正在构建一个BT设备,它将由主应用程序控制,我已经解决了Raspberry PI 3的原型设计问题,NodeJ使用了该模块

到目前为止,一切正常,设备被找到,我可以通过蓝牙设置和获取值。但是由于循环等原因,为了将设备可以执行的不同程序从蓝牙逻辑中分离出来,我选择将这些程序提取到外部NodeJS文件中

这里的想法是使用nodejsfork模块,通过主进程控制这些进程的启动和停止

但我的问题从这里开始。我可以毫无问题地分叉不同的JavaScript文件,并执行这些文件,但我无法让它们停止,我不知道如何修复它

以下是简化的代码:

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