我将尝试使用 Angular JS 为特定的利基市场构建一个便士拍卖网站。我正在尝试计划倒数计时器,并且我一直渴望尝试使用 firebase。
我昨天有一个想法,让每次拍卖都以某种方式在实际数据库中有一个倒计时,因为有了 2 种方式的数据绑定(bind),人们的客户端将始终保持更新。
当 firebase 发生变化时,所有连接的客户端都会立即发生变化。所以我的问题是……如何在特定记录中进行服务器端倒计时。
假设我有一个项目 x 的记录,它包含所有项目信息,并且数组键之一是“倒计时:59:01:00”。在服务器端从 59:01:00 到 00:00:00 倒计时的现实且可扩展的方法是什么。
我在想也许是每 1 秒运行一次的 cronjob?但是随着数百个数据库条目每秒运行数百个倒计时,服务器可能会崩溃。
有什么好主意吗?
最佳答案
Firebase 确实可以每秒处理数百个数据库操作(实际上更多)。但这将大大过度设计。
与其在服务器上运行每秒更新一次的计时器,不如简单地存储事件的开始/停止时间,并允许客户端管理自己的计时器。这不应该通过每秒递减 1 来完成(因为 setInterval 和其他客户端工具不是很精确),而是通过将当前时间戳与结尾进行比较,并确定差异。
timeout = setInterval(countDown, 1000);
function countDown() {
setTime(Math.max(0, endsAt - Date.now()));
if( endsAt <= Date.now() ) { clearInterval(timeout); }
}
function setTime(remaining) {
var minutes = Math.floor(remaining / 60000);
var seconds = Math.round(remaining / 1000);
$('#timer').text(lpad(minutes) + ':' + lpad(seconds));
}
很可能,您希望服务器负责计时器的原因是为了使其“公平”。但这不符合逻辑。如果每个用户都将自己的“代码”保留到结束时间,并且开始/结束时间是固定的,那么这里就没有什么可以破解的了。
关于javascript - 跨多个客户端同步的 Firebase 倒数计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25051212/