Meteor:如何判断数据库何时准备就绪?

时间:2013-02-28 07:25:29

标签: meteor

我希望在页面加载后尽快执行Meteor集合查询。我尝试的第一件事是这样的:

Games = new Meteor.Collection("games");
if (Meteor.isClient) {
  Meteor.startup(function() {
    console.log(Games.findOne({}));
  }); 
}

这不起作用(打印“未定义”)。从JavaScript控制台调用时,几秒钟后相同的查询工作。我假设在数据库准备好之前存在某种延迟。那么如何判断此查询何时成功呢?

OSX 10.8和Chrome 25下的Meteor版本0.5.7(7b1bf062b9)。

6 个答案:

答案 0 :(得分:17)

您应首先publish来自服务器的数据。

if(Meteor.isServer) {
    Meteor.publish('default_db_data', function(){
        return Games.find({});
    });
}

在客户端上,仅在从服务器加载数据后才执行收集查询。这可以通过在subscribe调用中使用被动会话来完成。

if (Meteor.isClient) {
  Meteor.startup(function() {
     Session.set('data_loaded', false); 
  }); 

  Meteor.subscribe('default_db_data', function(){
     //Set the reactive session as true to indicate that the data have been loaded
     Session.set('data_loaded', true); 
  });
}

现在,当您执行集合查询时,您可以检查数据是否已加载:

if(Session.get('data_loaded')){
     Games.find({});
}

注意:删除autopublish软件包,默认情况下会将您的所有数据发布到客户端,这是不好的做法。

要删除它,请在根项目目录中的每个项目上执行$ meteor remove autopublish

答案 1 :(得分:8)

使用DDP._allSubscriptionsReady()(流星0.7)

答案 2 :(得分:6)

从Meteor 1.0.4开始,有一个帮助器可以准确地告诉您特定订阅的准备时间:Template.instance().subscriptionsReady()

由于此问题是重复的,请在原始问题Displaying loader while meteor collection loads中查看我的答案。

答案 3 :(得分:1)

您还可以进行模板级订阅:

Template.name.onCreated(function(){
var self = this;

this.autorun(function(){

const db = this.subscribe('publicationname', [,args]);

if(db.isReady()){
 "You'll know it's ready here" .. do what you need.
 }
 });
})

这样也可以更容易地了解模板内部。你可以打电话      {{#if Template.subscriptionsReady}}     {{else}}加载屏幕可能是
    {{/如果}}

答案 4 :(得分:0)

如果您知道您的游戏集合永远不会为空,您可以检查何时最终返回结果:

Meteor.autorun(function() {
    if(Games.findOne() && !Session.get("loaded")) {
        Session.set("loaded",true);

        //Its ready..
        console.log(Games.findOne({}));
    }
});

您也可以在模板中使用它:

客户js:

Template.home.isReady = function() { return Session.get("loaded") };

HTML

<template name="home">
    {{#if isReady}}
        Yay! We're loaded!!
    {{else}}
        Hold an a second
    {{/if}}
</template>

答案 5 :(得分:0)

以下是可能正在使用存储在Meteor.users数据库中的用户ID或部分用户信息的人的另一些信息。当页面首次加载Meteor订阅时,在后台继续,可能不会完成。因此,当您尝试连接到另一个数据库以查询它时,它将不会提取信息。这是因为Meteor.user()本身仍为空;

原因如上所述,是因为实际的Meteor用户收集还没有通过提取数据。

处理此事的简单方法。

Meteor.status().connected

这将返回true或false,以便在Meteor.user集合准备就绪时通知您。然后你可以继续你的业务。

我希望这对某人有所帮助,我正要试着弄清楚如何检查状态。那是在弄清楚Meteor用户集合本身尚未加载之后。