イベントシステムを使用して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"
}