Подтвердить что ты не робот

Метеор: Как я могу узнать, когда база данных готова?

Я хочу выполнить запрос коллекции Meteor как можно скорее после загрузки страницы. Первое, что я пробовал, было примерно так:

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

Это не работает, хотя (он печатает "undefined" ). Тот же запрос работает через несколько секунд при вызове с консоли JavaScript. Я предполагаю, что есть какая-то лага, прежде чем база данных будет готова. Итак, как я могу узнать, когда этот запрос будет успешным?

Метеор версии 0.5.7 (7b1bf062b9) под OSX 10.8 и Chrome 25.

4b9b3361

Ответ 1

Сначала вы должны 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 в каждом проекте из корневого каталога проекта.

Ответ 2

Используйте DDP._allSubscriptionsReady() (Метеор 0.7)

Ответ 3

Как и в случае с Meteor 1.0.4, есть помощник, который сообщает вам, когда готовность конкретной подписки: Template.instance().subscriptionsReady().

Поскольку этот вопрос является дубликатом, пожалуйста, проверьте мой ответ в исходном вопросе Отображение загрузчика при загрузке сбора метеоров.

Ответ 4

Вы также можете подписаться на уровне шаблона:

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

this.autorun(function(){

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

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

Это также облегчает поиск внутри шаблона. вы можете просто позвонить    {{# if Template.subscriptionsReady}}   {{else}} Загрузка экрана может быть   {{/, Если}}

Ответ 5

Вы можете проверить, когда результат будет окончательно возвращен, если вы знаете, что ваша коллекция игр никогда не пуста:

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>

Ответ 6

Вот еще один лакомый кусочек информации для тех, кто может использовать идентификатор пользователя или часть информации о пользователе, хранящуюся в базе данных Meteor.users. Когда страница сначала загружает подписку "Метеор", проходящую в фоновом режиме, может не быть полной. Поэтому, когда вы пытаетесь подключиться к другой базе данных, чтобы запросить это, он не будет извлекать информацию. Это связано с тем, что Meteor.user() по-прежнему является нулевым,

Причина, как было сказано выше, заключается в том, что фактическая коллекция пользователей Meteor не получила доступ к данным.

Простой способ справиться с этим.

Meteor.status().connected

Это вернет true или false, чтобы вы знали, когда коллекция Meteor.user готова. Тогда вы можете продолжить свой бизнес.

Я надеюсь, что это поможет кому-то, я собирался вытащить свои волосы, пытаясь понять, как проверить статус. Это было сделано после того, как выяснилось, что коллекция пользователей Meteor еще не загружена.