从客户端设置和清除节点服务器上的超时
Set and Clear Timeout on Node Server from Client
我试图允许用户从客户端设置警报并将其传递给服务器。然后,服务器有一个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 Calendar这样的应用程序如何存储日期和时间,然后确切地知道何时触发它以及提供取消它的能力?这基本上是相同的思想。更新:我使用以下解决方案使其工作。
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);
}
});
根据您正在构建的应用程序的大小,有几个选项。
<标题> 处理队列您可以重新构建应用程序,使用作业队列而不是简单地设置计时器。这样做的好处是将来可以将其拆分为多个进程,但这会使处理变得复杂一些。
像Kue这样的库只使用Redis,允许你在将来做一个延迟的put来设置事件。
从Kue自述:
var kue = require('kue')
, jobs = kue.createQueue();
// Create delayed job (need to store email.id in redis as well)
var email = jobs.create('email', {
title: 'Account renewal required',
to: 'tj@learnboost.com',
template: 'renewal-email'
}).delay(minute).save();
// Process job
jobs.process('email', function(job, done){
email(job.data.to, done);
});
// Cancel job
email.remove(function(err){
if (err) throw err;
console.log('removed completed job #%d', job.id);
});
存储超时引用
这个健壮性要差得多,但可以让您非常简单地完成它。它使全局变量四处浮动,如果进程崩溃,则无法恢复。
基本上,您将计时器存储在一个全局变量中,并根据作业id取消它。
var myAlarms = {}
socket.on('alarm:config', function(list, date, time, bool) {
var alarmName = "timer:" + list;
if (bool) {
myAlarms[alarmName] = setTimeout(function() {
// do stuff...
}, countdown);
} else {
clearTimeout(myAlarms[alarmName]);
}
}
注意:这些代码都没有经过测试,它可能包含错误
标题>相关文章:
- 使用JSP从服务器检索和显示图像
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 客户端服务器REST API captcha实现
- 正在将base64 jpeg从input-type=file上传到服务器
- Zkoss:如何通知用户会话超时或与服务器的连接丢失
- 不知道为什么我的服务器超时.
- 节点.js服务器在浏览器中超时,但 cURL 请求有效
- 如何为重定向或其他服务器上新打开的页面设置超时
- node.js HTTP服务器、请求和响应超时之间的区别
- 在javascript或服务器端处理会话超时
- Strophe.js客户端连接到服务器,断开连接/超时
- Node.js:服务器等待响应和超时
- 调用collection.find()会导致内部服务器错误并在之后超时
- 处理Datatables中的会话超时(使用服务器端数据源处理)
- 我在客户端和服务器端都实现了xdomain脚本,但在IE9中不断获得'超时等待iframe套接字'警告
- socket.io非活动客户端连接的服务器端超时
- CoffeeScript:使用 node-imap 向服务器进行身份验证时出现超时错误
- 从客户端设置和清除节点服务器上的超时
- 在PhoneGap窗口.location.assign()中连接到服务器超时
- 如何检测ajax请求上的php服务器超时