Meteor:观察带有reactiveVar的集合

时间:2015-02-04 10:15:37

标签: javascript collections javascript-events meteor mongodb-query

我有一个应用程序,用户可以在其中管理多个闹钟(设置新闹钟,编辑闹​​钟或打盹)

当达到闹钟时间时,我需要通知用户。如果用户点击了贪睡,则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中 - 这会有帮助吗?关于做得更好/更聪明的任何建议?

1 个答案:

答案 0 :(得分:1)

要在将来执行代码,您需要使用setTimeout。在observe查询中,不关心时间,并在added回调中计算警报响应前剩余的毫秒数,并使用setTimeout来调用{{ 1}}在那个毫秒之后。

您可能还需要在processAlarmEnd回调中取消setTimeout clearTimeout