Meteor:使用 reactiveVar 观察集合

Posted

技术标签:

【中文标题】Meteor:使用 reactiveVar 观察集合【英文标题】:Meteor: observe a collection with reactiveVar 【发布时间】:2015-04-03 19:41:14 【问题描述】:

我有一个应用程序,用户可以在其中管理多个警报(设置新警报、编辑或暂停)

当到达闹钟时间时,我需要通知用户。如果用户点击贪睡,time_end 字段会增加 5 分钟。

我如何跟踪到达闹钟时间的时间?

我尝试过使用collection.observe() - 但它只能在服务器启动时工作一次

服务器:Meteor 启动

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】:

为了让代码在以后执行,你需要使用setTimeout。在您的observe 查询中,不要关心时间,在added 回调中,计算距离警报响起还有多少毫秒,并在该毫秒数之后使用setTimeout 调用processAlarmEnd .

您可能还需要在removed 回调中取消setTimeoutclearTimeout

【讨论】:

是的,这是个好主意……但是如何管理大量的 setTimeout 函数? 我想这会工作How do you handle multiple instances of setTimeout()? @Habib,是的,将所有对setTimeout 的句柄调用存储在addedremoved 回调之外的变量中的对象中似乎是个好主意。但请确保在警报结束时从对象中删除句柄(因此对象不包含不再使用的旧句柄)。

以上是关于Meteor:使用 reactiveVar 观察集合的主要内容,如果未能解决你的问题,请参考以下文章

带有 Meteor 的 Blaze-Apollo,观察者不会触发变量更改的订阅

Mongo在Meteor Server上插入后如何等待观察者调用

Meteor 文档中的消息计数示例如何工作?

观察事件中闪亮的反应数据集

为啥 50-50 的训练/测试拆分最适合使用此神经网络的 178 个观察数据集?

趋势观察:第五代精简指令集RISC