ユーザーがクライアントからアラームを設定してサーバーに渡すことを許可しようとしています。次に、サーバーにはカウントダウンする setTimeout があり、時間がなくなると関数が実行されます。
この最初の部分は正常に動作していますが、クライアントが特定のアラームをキャンセルすることを決定した場合に、同じタイムアウトをクリアする機能が必要です。
注: Redis を使用してさまざまなデータを保存してきたので、それが利用可能です。
var client = redis.createClient();
io.set("store", new sio.RedisStore);
io.sockets.on('connection', function (socket) {
socket.on('alarm:config', function(list, date, time, bool) {
if (bool) {
var now = new Date().getTime();
var year = date[0],
month = date[1] - 1,
day = date[2];
var hour = time[0],
minutes = time[1];
var alarm = new Date(year, month, day, hour, minutes);
var countdown = alarm - now;
var myAlarm = setTimeout(function() {
// do stuff...
}, ( countdown ) );
} else {
clearTimeout(myAlarm);
}
});
});
私が念頭に置いているアプローチは、ブール値を使用して、ユーザーがその特定のアラームを設定しているかキャンセルしているかを判断することです。ローカル変数「myAlarm」を設定してもうまくいかないことに気づきました。アイデアを伝えるためにそこに置いただけです。
その正確なタイムアウトへの参照を保存する方法を見つけようとしています。これにより、次回「alarm:config」ソケット イベントが偽のブール値でトリガーされたときに、以前に設定されたタイムアウトをキャンセルできるようになります。
それはまったく別の質問かもしれませんが、Google カレンダーのようなアプリケーションはどのようにして日付と時刻を保存し、それをトリガーするタイミングを正確に把握し、キャンセルする機能を提供するのでしょうか? これは本質的に同じ考えです。
更新:次のソリューションを使用して動作しています。私はよりエレガントなソリューションを受け入れています。
socket.on('alarm:config', function(list, date, time, bool) {
var alarmName = "timer:" + list;
if (bool) {
client.hset(alarmName, "status", true);
var now = new Date().getTime();
var year = date[0],
month = date[1] - 1,
day = date[2];
var hour = time[0],
minutes = time[1];
var alarm = new Date(year, month, day, hour, minutes);
var countdown = alarm - now;
setTimeout(function() {
client.hget(alarmName, "status", function(err, bool) {
if(bool == 'true') {
// do stuff...
} else {
console.log("This alarm has been canceled.");
}
});
}, ( countdown ) );
} else {
console.log('canceling alarm');
client.hset(alarmName, "status", false);
}
});