我正在使用node.js开展项目。我正在拉入一大堆JSON数据,我需要根据收到的数据安排作业从串口写入数据。我正在使用node-schedule执行此任务。有几个作业需要安排,每个作业的命令不同。我发现在scheduleJob
调用中传递给函数的参数在执行时解释,而不是在for循环中调度。关于如何让字符串参数保持不变的任何想法?
代码示例:
var schedule = require('node-schedule');
var schedules[];
…
var startrule = new schedule.RecurrenceRule();
var start_hour = thejson.start_hour;
var start_minute = thejson.start_minute;
for (var k = 0; k < thejson.zones.length; k++)
{
//start
startrule.hour = start_hour;
startrule.minute = start_minute;
var start = schedule.scheduleJob(startrule, function(){
writeSerial('//S' + thejson.zones[k].number + ',1');
});
schedules.push(start); //upon next json update, old schedules in array are cancelled.
}
执行时,thejson.zones[k].number
失败,因为k
未知。如何将writeSerial()
的字符串参数设置为静态/常量?我已经尝试将它粘贴在一个数组中并将一个索引传递给日程表中的writeSerial
,但该索引变量也会在计划执行时被解释。
答案 0 :(得分:2)
您必须在一个函数中包含预定作业的建立,以提供每个作业唯一的词法范围:
var start = schedule.scheduleJob(startrule, function(number){
return function() {
writeSerial('//S' + number + ',1');
};
}(thejson.zones[k].number));
该匿名且立即调用的函数的参数“number”确保它返回的调度函数将使用数据结构的该部分的安全副本。
如果没有这个额外的图层,您安排的每个作业都会共享相同的变量“k”。当“k”等于列表的长度时,使用“k”的循环结束,因此每个作业(当它最终按计划调用时)看到“k”指向超出数组末尾的点
答案 1 :(得分:1)
我首选的解决方案是创建部分功能:
var start = schedule.scheduleJob(startrule, function(number) {
writeSerial('//S' + number + ',1');
}.bind(null, thejson.zones[k].number);
这会创建一个匿名函数,其第一个参数已绑定到它。