我在这里碰壁,也许这只是一个小问题,由于我对NodeJS缺乏经验,我无法看到解决方案。
现在我正在构建一个由主应用程序控制的BT设备,我已经决定使用Bleno模块在带有NodeJS的Raspberry PI 3上进行原型设计。
到目前为止一切正常,设备被发现,我可以通过蓝牙设置和获取值。但要分开不同的"程序"设备可以从蓝牙逻辑执行(因为循环等)我选择将这些提取到外部NodeJS文件。
这里的想法是使用NodeJS fork模块并通过主进程控制这些进程的启动和停止。
但在这里我的问题开始了。我可以毫无问题地分叉不同的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调用中获取子进程。 由于我从未使用JavaScript进行过扩展,除了网站上的一些小脚本,我不知道我的错误到底在哪里。 我认为它与类变量的处理有关。
我的出发点是Bleno的Pizza例子。
希望信息足够,有人可以帮助我 提前谢谢!
答案 0 :(得分:1)
由于killProgram()
是BLELamp
范围之外的独立函数,因此您需要通过将BLELamp
绑定为this
来调用具有正确范围的killProgram。使用apply(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)应解决它。以下我希望能解决它(唯一的换行是调用killProgram
):
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);
};
作为旁注,您的代码有点令人困惑,因为您有一个独立的var currentProgram
,然后是一对具有自己的绑定this.currentProgram
的原型。我会更改名称以防止混淆。