Frage Meteor: Wie kann ich feststellen, wann die Datenbank fertig ist?


Ich möchte so bald wie möglich nach dem Laden der Seite eine Meteor-Abfrage durchführen. Das erste, was ich ausprobiert habe, war so etwas:

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

Dies funktioniert jedoch nicht (es druckt "undefined"). Die gleiche Abfrage funktioniert einige Sekunden später, wenn sie von der JavaScript-Konsole aus aufgerufen wird. Ich nehme an, dass es eine Art Verzögerung gibt, bevor die Datenbank fertig ist. Also, wie kann ich sagen, wenn diese Abfrage erfolgreich ist?

Meteor Version 0.5.7 (7b1bf062b9) unter OSX 10.8 und Chrome 25.


14
2018-02-28 07:25


Ursprung


Antworten:


Du solltest zuerst publish die Daten vom Server.

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

Führen Sie auf dem Client die Sammlungsabfragen erst aus, nachdem die Daten vom Server geladen wurden. Dies kann durch Verwendung einer reaktiven Sitzung in der subscribe Anrufe.

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); 
  });
}

Wenn Sie jetzt Sammlungsabfragen durchführen, können Sie prüfen, ob die Daten geladen sind oder nicht:

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

Hinweis: Löschen autopublish Paket, es veröffentlicht alle Ihre Daten standardmäßig auf dem Client und ist eine schlechte Praxis.

Um es zu entfernen, führe es aus $ meteor remove autopublish zu jedem Projekt aus dem Root-Projektverzeichnis.


17
2018-02-28 09:31



Benutzen DDP._allSubscriptionsReady() (Meteor 0,7)


8
2017-12-27 15:29



Ab Meteor 1.0.4 gibt es einen Helfer, der Ihnen genau sagt, wann ein bestimmtes Abonnement bereit ist: Template.instance().subscriptionsReady().

Da diese Frage ein Duplikat ist, überprüfen Sie bitte meine Antwort in der ursprünglichen Frage, Anzeige des Loaders während der Meteor-Sammelladung.


6
2018-04-05 19:50



Sie können auch Abonnements auf Vorlagenebene ausführen:

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.
 }
 });
})

Dies erleichtert es auch, innerhalb der Vorlage zu wissen. Sie können einfach anrufen      {{# TemplateSubscriptionsReady}}     {{else}} Ladebildschirm möglicherweise
    {{/ob}}


1
2018-04-21 03:04



Sie können überprüfen, wann ein Ergebnis zurückgegeben wird, wenn Sie wissen, dass Ihre Games-Sammlung niemals leer ist:

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

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

Sie können dies auch in Ihren Vorlagen verwenden:

Kunde 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>

0
2018-02-28 11:39



Hier ist ein weiterer Leckerbissen mit Informationen für diejenigen, die Benutzer-ID oder einen Teil der Benutzerinformationen verwenden, die in der Meteor.users-Datenbank gespeichert sind. Wenn die Seite zuerst die Meteor-Subscribe lädt, die im Hintergrund läuft, ist sie möglicherweise nicht vollständig. Wenn Sie versuchen, eine Verbindung mit einer anderen Datenbank herzustellen, um diese Abfrage durchzuführen, werden die Informationen nicht abgerufen. Dies ist, weil die Meteor.user() ist immer noch null selbst;

Der Grund, wie oben erwähnt, liegt darin, dass die tatsächliche Sammlung der Meteor-Benutzer nicht durch das Ziehen der Daten gekommen ist.

Einfacher Umgang damit.

Meteor.status().connected

Dies wird wahr oder falsch zurückgeben, um Sie wissen zu lassen, wann Meteor.user Sammlung ist fertig. Dann können Sie über Ihr Geschäft weitermachen.

Ich hoffe, das hilft jemandem, ich wollte mir gerade die Haare ausziehen, um herauszufinden, wie ich den Status überprüfen kann. Das war nach dem Herausfinden der Meteor User Collection selbst noch nicht geladen.


0
2018-04-21 00:57