我有一个应用程序,用户可以在其中管理多个闹钟(设置新闹钟,编辑闹钟或打盹)
当达到闹钟时间时,我需要通知用户。如果用户点击了贪睡,则time_end字段会添加5分钟。
如何跟踪何时达到闹钟时间?
我尝试过使用集合 .observe() - 但它只在服务器启动时运行一次
服务器:流星启动
var expiredAlarms = Alarms.find({$and: [{"time_end": {$lt: moment()._d}}, {notification_sent: false}]});
expiredAlarms.observe({
added: function(doc) {
console.log('alarm timeout has been reached');
processAlarmEnd(); //set notification_sent to true
},
removed: function(doc) {
console.log('A notification has been sent');
}
});
以上代码仅在启动应用程序时有效并处理过期警报的所有通知 - 但一旦新警报到期,则不会发生任何事情。我的猜测是因为moment()._ d没有改变,并且一遍又一遍地调用相同的旧查询。
我应该将此代码放在Tracker.autorun中 - 这会有帮助吗?关于做得更好/更聪明的任何建议?
答案 0 :(得分:1)
要在将来执行代码,您需要使用setTimeout
。在observe
查询中,不关心时间,并在added
回调中计算警报响应前剩余的毫秒数,并使用setTimeout
来调用{{ 1}}在那个毫秒之后。
您可能还需要在processAlarmEnd
回调中取消setTimeout
clearTimeout
。