0

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スケジュール内にインデックスを渡そうとしたのですが、そのインデックス変数もスケジュール実行時に解釈されてしまいます。

4

2 に答える 2

2

スケジュールされたジョブの確立を関数でラップして、ジョブごとに一意の字句スコープを提供する必要があります。

  var start = schedule.scheduleJob(startrule, function(number){
    return function() {
        writeSerial('//S' + number + ',1');
    };
  }(thejson.zones[k].number));

その匿名ですぐに呼び出される関数のパラメーター「番号」は、それが返すスケジュールされた関数がデータ構造のその部分の安全なコピーで動作することを保証します。

その余分なレイヤーがなければ、スケジュールしたジョブのそれぞれが同じ変数「k」を共有していました。「k」が使用されるループは、「k」がリストの長さに等しくなったときに終了するため、各ジョブ (最終的にスケジュールどおりに呼び出されたとき) は、「k」が配列の末尾を超えた場所を指していることを認識します。 .

于 2013-10-02T17:20:57.227 に答える
1

私の好ましい解決策は、部分関数を作成することです:

var start = schedule.scheduleJob(startrule, function(number) {
  writeSerial('//S' + number + ',1');
}.bind(null, thejson.zones[k].number);

これにより、最初の引数が既にバインドされている無名関数が作成されます。

于 2013-10-02T17:48:57.880 に答える