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

Meteor - использование коллекции при запуске клиента

Почему этот код показывает "0"? Должен ли он не возвращать "1"?

Messages = new Meteor.Collection("messages");

if (Meteor.is_client) {
    Meteor.startup(function () {    
        alert(Messages.find().count());
    });
}

if (Meteor.is_server) {
    Meteor.startup(function () {
        Messages.insert({text: "server says hello"});
    });
}

Если позже "Messages.find(). count()", он возвращает 1.

4b9b3361

Ответ 1

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

Meteor.startup() на клиенте очень похож на $() в jQuery - он запускает свой аргумент, когда клиентская DOM готова. Он не дожидается, когда ваши клиентские коллекции получат все свои документы с сервера. Таким образом, как вы написали код, вызов find() будет всегда запускаться слишком рано и возвращать 0.

Если вы хотите дождаться запуска кода до тех пор, пока сборка не будет сначала загружена с сервера, вам необходимо использовать Meteor.subscribe() для явной подписки на коллекцию. subscribe() выполняет обратный вызов, который будет выполняться, когда исходный набор документов находится на клиенте.

См:

публикация метеоров и метеорная подписка

Ответ 2

Только для того, чтобы следить за примером кода, как узнать, когда коллекция готова к использованию на клиенте.

Как описано @debergalis, вы должны использовать Meteor.subscribe - он принимает пару обратных вызовов, особенно onReady

Например:

if(Meteor.isClient){

    Meteor.subscribe("myCollection", {

        onReady: function(){

            // do stuff with my collection

        }

    });

}