我将采用角度JS来为一个特定的利基建立一个便士拍卖网站。我正在尝试计划倒数计时器,我一直在寻找试用firebase的理由。
昨天我有想法让每次拍卖都以某种方式在实际数据库中进行倒计时,因为通过双向数据绑定,人们将始终保持更新。
当firebase更改时,所有连接的客户端立即更改。所以我的问题是......我怎样才能在特定记录中进行服务器端倒计时。
所以说我有一个项目x的记录,它有所有项目信息,其中一个数组键是“倒计时:59:01:00”。什么是在SERVER端从59:01:00到00:00:00倒计时的现实和可扩展的方式。
我在想也许是每1秒运行一次的cronjob?但随后数百个数据库条目每秒运行数百个倒计时,服务器可能会崩溃。
有什么好主意吗?
答案 0 :(得分:7)
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));
}
最有可能的是,您希望服务器负责计时器的原因是让它“公平”。但这不符合逻辑。如果每个用户将自己的“自动收报机”保持到结束时间,并且开始/结束时间是固定的,那么这里没有什么可以破解的。
答案 1 :(得分:0)
我正在处理类似的问题。
第一个问题是没有服务器端代码。 Firebase是数据存储,您需要实现的任何逻辑都需要分为数据库设计和客户端代码。
如果数据库中的实际时间戳字段未更改,如何使客户端监听从未来到过去的时间戳更改的第二个问题。
客户总是可以通过按时间戳占位符并听取更改来询问当前服务器时间。
auction:{
countdown:{
ends_in: NUMBER_IN_MLS,
start_time: TIME_STAMP
}
}
users_current_time: TIMESTAMP_PLACEHOLDER
如果用户在应用上启动并希望查看当前的竞价 立即拉动当前服务器时间,客户端的计时器从0开始。 - 每次用户上线时都可以重复此操作。现在,当用户开始拍卖时,他将获得开始时间和持续时间。您还拥有当前服务器时间和在线时间。这应该为您提供有关剩余时间的非常准确的信息。
第三个问题: 我在这里更关心的是安全问题。拍卖应该在时间结束时关闭,但是只有firebase作为后端,所有客户仍然有写入权限来提交他们的出价。
我仍然会推荐一些可以完成所有内务处理并计算倒计时的服务器。