Meteor - クライアントの起動時にコレクションを使用する 質問する

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 が返されます。

ベストアンサー1

デフォルトでは、Meteor クライアントが起動すると、サーバーに接続し、Meteor.Collection定義した任意のドキュメントをサブスクライブします。サーバー接続を確立してドキュメントを受信するまでには常にある程度の遅延があるため、完了するまでに時間がかかります。

Meteor.startup()クライアント側はjQueryとよく似ていて$()、クライアントDOMの準備ができたら引数を実行します。ないクライアントのコレクションがサーバーからすべてのドキュメントを受信するまで待機します。したがって、コードの記述方法によっては、 の呼び出しがfind()常に早く実行され、0 が返されます。

コレクションがサーバーから最初にダウンロードされるまでコードの実行を待機する場合は、 を使用してMeteor.subscribe()コレクションを明示的にサブスクライブする必要があります。subscribe()は、ドキュメントの初期セットがクライアント上にあるときに実行されるコールバックを取得します。

見る:

流星出版そして流星購読

おすすめ記事