0

イベントシステムを使用してNodejsで開発しようとしています。次のコードを実装し、テストに合格しました(モカを使用)。thatただし、変数のスコープのため、本番環境で機能するかどうかは確信が持てません。

私のコードでは、 を割り当てthat=thisます。configその後、オブジェクトを割り当て、that.configコールバックは構成をパラメーターとして渡さずにイベントを発行します。次に、リスナー関数は を使用しthat.configて別のシグナルを送信します。キャッシュ オブジェクトは、redis データベースへの要求です。

問題は、that.configオブジェクトは、シグナルを発信したときに常にスコープを参照するのか、それとも、最初に発信されたシグナルの後、最初のリスナーがthat.config(別のコールバック内で)使用する前に、別の要求 (別の構成を取得する) によって変更される可能性があるのか​​ということです。

function SensorTrigger(sensorClass, configClass) {
  this.sensorClass = sensorClass || {'entityName': 'sensor'};
  this.configClass = configClass || {'entityName': 'config'};
  this.cache = new CacheRedis(app.redisClient, app.logmessage);
  events.EventEmitter.call(this);
}

util.inherits(SensorTrigger, events.EventEmitter);

SensorTrigger.prototype.getSensorConfig = function(sensor, trigger) {
  var that = this
    , sensorKeyId = that.sensorClass.entityName + ':' + sensor
    , baseKeyId = "base";

  that.trigger = trigger;
  that.id = sensor;

  var callBack = function (config) {
    config = utils.deepen(config);
    that.receiver = config.receiver;
    that.config = config.triggers[that.trigger];
    that.emit(that.config.data, sensor);
  }

  that.cache.getItem(that.configClass, sensorKeyId, function(err, config) {
    if (!config) {
      that.cache.getItem(that.configClass, baseKeyId, function(err, config) {
        callBack(config);
      })
    } else {
      callBack(config);
    } 
  })
}

SensorTrigger.prototype.getAllData = function(sensor) {
  var that = this;
  that.cache.getAllData(that.sensorClass, sensor, function(err, data) {
    if (err) {
       that.emit("error", err);
    } else {
      that.emit(that.config.aggregation, sensor, data); 
    }
  })
}

trigger = new SensorTrigger();

trigger.on("onNewData", trigger.getSensorConfig); 
trigger.on("all", trigger.getAllData);

構成オブジェクトの例:

{
    "id": "base",
    "triggers.onNewData.data": "all",
    "triggers.onNewData.aggregation": "max",
    "triggers.onNewData.trigger": "threshold",
    "receiver.host": "localhost",
    "receiver.port": "8889",
    "receiver.path": "/receiver"
}
4

1 に答える 1

0

次回の実行時に「それ」が の別のインスタンスに変更された場合のみthis。各インスタンスには独自の機能があるため、次のようなことを行う場合にのみ発生する可能性があります。

var trigger = new SensorTrigger(sensor, config);
trigger.getSensorConfig.apply(SOMETHING_ELSE, sensor2, trigger2);

通常どおりに使用する限り、次のようになります。

var trigger = new SensorTrigger(sensor, config);
trigger.getSensorConfig(sensor2, trigger2);

//or even:

trigger.getSensorConfig.apply(trigger, sensor2, trigger2);

それは結構です。あなたがしていることは、JavaScript の一般的な方法であり、本番環境で常に使用されています。

于 2013-03-13T12:09:52.430 に答える