node.js计划执行中的字符串常量

时间:2013-10-02 17:17:38

标签: javascript node.js

我正在使用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,但该索引变量也会在计划执行时被解释。

2 个答案:

答案 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);

这会创建一个匿名函数,其第一个参数已绑定到它。