Javascript 使流星出版物对时间作出反应
我在弄清楚如何使订阅响应某个发布查询时遇到了一点困难 我的出版物如下:Javascript 使流星出版物对时间作出反应,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我在弄清楚如何使订阅响应某个发布查询时遇到了一点困难 我的出版物如下: Meteor.publish('allData', function(){ return Data.find({TTL: {$gt: new Date()}}) }) 如您所见,文档包含一个TTL字段。只要生存时间仍然大于当前时间,就可以将其发送到客户端,如果不是,就不应该发送 订阅: this.autorun(() => { this.subscribe('allData') }) 在初始加载时,
Meteor.publish('allData', function(){
return Data.find({TTL: {$gt: new Date()}})
})
如您所见,文档包含一个TTL字段。只要生存时间仍然大于当前时间,就可以将其发送到客户端,如果不是,就不应该发送
订阅:
this.autorun(() => {
this.subscribe('allData')
})
在初始加载时,所有数据都正常,但只要TTL过期,文档就会保留在客户机上,除非我重新加载页面。是否有任何方法可以反应性地处理此问题,使过期的文档从客户端消失?使用包使时间本身反应,然后执行以下操作:
客户:
Meteor.subscribe('allDataSince',Chronos.currentTime());
服务器:
Meteor.publish('allDataSince', t => Data.find({ TTL: { $gt: t }}));
ReactiveVar和自动运行的组合为我实现了这一目标。这可能是过分的,但它是有效的
let cutoffTimestamp = new ReactiveVar();
Meteor.setInterval(function() {
cutoffTimestamp.set(Date.now() - 1);
}, 60000);
Meteor.publish("myPub", function() {
this.autorun(function() {
return myCollection.find({ timestamp: { $gte: cutoffTimestamp.get(); } });
});
});
问题是,
newdate()
不是反应性数据,出版物不会随着时间的变化而重新评估。这是有道理的,与约翰·阿尔托夫的答案相似,但似乎不起作用。这可能与我在/imports
文件夹中工作有关吗?可能-您可能必须导入ChronosMeteor发布函数,因为它们本身不能处理反应性。您应该在发布函数中的autorun
中添加反应性。然后chronos
就可以工作了。要获得对自动运行的支持,您应该使用package。谢谢@Mitar-我将答案更改为在订阅中使用反应时间,而不是出版物本身。谢谢您的回答Johan,您认为Michel Floyd的答案与您的答案类似吗?考虑到它使用一个反应性包而不是反应性变量,Michel的回答很好,因为它使时间成为一个反应性数据源,所以它解决了您的具体问题。我的回答展示了如何做出一些反应性的东西,而这些反应性的东西不是反应性的,并且可能对偶然发现这个问题的其他人有益。