流星:用 reactiveVar 观察一个集合
Meteor: observe a collection with reactiveVar
我有一个应用程序,用户可以在其中管理多个闹钟(设置新闹钟、编辑或暂停)
当到达闹钟时间时,我需要通知用户。如果用户点击暂停,time_end 字段会增加 5 分钟。
如何跟踪达到闹钟时间?
我试过使用 collection.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
中 - 这会有帮助吗?对此有何建议 better/smarter?
要使代码在以后执行,您需要使用setTimeout
。在您的 observe
查询中,不要关心时间,在 added
回调中,计算闹钟响起之前剩余的毫秒数,并使用 setTimeout
调用 processAlarmEnd
在该毫秒数之后。
您可能还需要在 removed
回调中使用 clearTimeout
取消 setTimeout
。
我有一个应用程序,用户可以在其中管理多个闹钟(设置新闹钟、编辑或暂停)
当到达闹钟时间时,我需要通知用户。如果用户点击暂停,time_end 字段会增加 5 分钟。
如何跟踪达到闹钟时间?
我试过使用 collection.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
中 - 这会有帮助吗?对此有何建议 better/smarter?
要使代码在以后执行,您需要使用setTimeout
。在您的 observe
查询中,不要关心时间,在 added
回调中,计算闹钟响起之前剩余的毫秒数,并使用 setTimeout
调用 processAlarmEnd
在该毫秒数之后。
您可能还需要在 removed
回调中使用 clearTimeout
取消 setTimeout
。