我必须在nodejs中创建一个定时应用程序,用户可以设置每日,每周和每月。我的第一个尝试是创造这样的东西:
socket.on("connect")
{
client.on("authenticate")
{
var frequency = GetTimersForUser(client);
var timersInMilliseconds = ConvertFrequencyToMS(frequency);
var nextInMS = GetLower(timersInMilliseconds);
setTimeout("timedCount()",nextInMS );
}
}
timedCount()
{
cancelTimer;
client.emit("poke");
var frequency = GetTimersForUsers(client);
...
setTimeout("timedCount()",nextInMS );
}
但这不会提醒我失败的计时器(如果客户端断开连接),因为计时器仅在连接后创建,所以我在连接之前创建计时器。那么,每秒创建一个计时器是否更快:
userslist = getIndividualUsersNextTimerAsDate();
setTimout("timedCount()",1000);
timedCount()
{
foreach(user in userslist)
{
if(user.time <= now())
{
if(user.socket)
{
user.socket.emit("poke");
}
user.time = resetTimeForNextTimer(user);
}
}
}
socket.on("connect")
{
...
userslist[x].socket = client;
}
每隔“时间”或多个计时器:
var userslist = GetUsersTimers();
foreach(user in userslist)
{
user.Counter = setTimeout("runTime()",client.timer );
}
runTime(client)
{
client.emit("poke");
client.Counter.cancel();
client.timer = resetToNextTimer();
client.Counter = setTimeout("runTime()",client.timer );
}
还是有更好的方法让我失踪?
答案 0 :(得分:0)
听起来你的一些计时器可能持续数天,但连接通常不能存活很长时间。用户是否会重新连接到服务器并始终连接?
假设用户始终是连接的,那么我会将结束时间存储在数据库中。如果服务器出现故障,您可以恢复结束时间并正常重启。当你得到一个新的计时器时,使用setTimeout进入睡眠状态。重新启动时,您可以重新执行setTimeout,因为您知道结束时间和当前时间(即获取持续时间)。
这可以使用“合理”数量的计时器。如果您将拥有数百万个这样的计时器,那么使用每隔X毫秒/秒/分钟唤醒的setInterval实际上可能会更好,检查是否已经过了任何结束时间,对这些计时器起作用,然后再回到睡眠状态