我有一个问题,但我似乎不知道该怎么做 -
我见过很多客户端倒计时插件,我的应用程序上也有一个 - 但是我有兴趣在我的服务器上计数到某个日期,一旦该日期和时间到达,我想通过弹出页面触发对客户端的响应。
现在 - 我尝试在客户端使用 countdown.onFinish 函数执行此操作。但从我的理解来看,除非客户端在倒计时完成时位于应用程序中,否则它将无法工作。我是否正确假设客户端脚本仅在客户端进入应用程序时生成?因此,当用户进来时,计时器已经重新启动(登录时我更新计时器以倒计时到最近的星期一 21:00)。 在服务器上 - 我可以在函数之外检查日期是否已到达,但这只会在部署时发生一次,对吗?如果我以某种间隔检查它,每次更新应用程序时,这些间隔都会变得困惑,我可能会错过 00:00 小时。
这是我在服务端的想法(使用expressJS,nodeJS)
var today = new Date();
var currentDay = today.getDay() + 1;
var currentMonth = today.getMonth() + 1;
var currentDate = today.getDate();
var currentYear = today.getFullYear();
//var date = [02, 22, 2014];
var dateTillMatch = findNearestMonday(currentDay, currentDate, currentMonth, currentYear);
if (dateTillMatch[0] == currentDay && dateTillMatch[1] == currentDate && dateTillMatch[2] == currentMonth && dateTillMatch[3] == currentYear) {
updateAllStats();
}
这就是我在客户端的内容 - 它不起作用 - 因为在 00:00 时我的用户都不在应用程序内! (我知道天才..)
function timer(date) {
$('#clock').countdown(date[2] + '/' + date[0] + '/' + date[1] + ' 21:30:00', function(event) {
$(this).html(event.strftime('%D days %H:%M:%S'));
}).on('finish.countdown', function(event) {
var played = localStorage.getItem('attending');
//If the player was attending/not attending at end of countdown, send to DB that GamesPlayed ++ or gamesNotPlayed ++
if (played == 1 || played == -1) {
var request = false;
var result = null;
var name = localStorage.getItem('first') + " " + localStorage.getItem('last');
request = new XMLHttpRequest();
if (request) {
request.open("GET", "usersGamesPlayed/" + name + "_" + played);
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
result = JSON.parse(request.responseText);
if (result == null) {
alert('PROBLEMO');
} else {
if (played == 1) {
localStorage.setItem('gamesPlayed', parseInt(result.gamesPlayed));
} else {
localStorage.setItem('gamesNotPlayed', parseInt(result.gamesNotPlayed));
}
//Set back to 0
localStorage.setItem('attending', 0);
//Popup to find Best Player
console.log("Choose MVP");
$('#bestPlayerPopup').popup();
$("#bestPlayerPopup").popup("open");
}
}
};
request.send(null);
}
}
});
}
总而言之 - 我明白等待客户端计数器到达 00:00 是没有意义的,因为“如果一棵树倒下而没有人听到它,它会发出声音吗?” - 或者其他的东西 :) 那么我该如何在服务器上做同样的事情呢?并且 - 在时间结束时,我如何向用户发送弹出窗口 - 或者至少将他重定向到页面。我需要将它绑定(bind)到客户端的某些请求吗?因为这违背了在 00:00 做这件事的目的。 我的数据库是 MongoDB,因此如果需要我可以使用它。
我希望问题不要太长! 谢谢
最佳答案
我会使用 websockets (http://socket.io)。使用服务器上的 node.js 计时器 API 生成事件,该事件将必要的数据发送到所有正在监听(查看倒计时页面)的客户端。
在客户端,您捕获该事件,然后使用收到的数据更新当前页面,或者向“倒计时完成”页面发出新的获取请求。
关于javascript - 在服务器端 Node.JS 倒计时并发送页面响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319521/