2015-07-28 17 views
7

Ich habe ein Abonnement, das nach ready() Aufruf, eine Reihe von Aktualisierungen von Daten aus anderen Sammlungen führt ziehen:Meteor: Asynchron-Update-Abonnement

Meteor.publish('foo', function() { 
    this.ready() 

    // Several times: 
    var extraData = OtherCollection.findOne(...) 
    this.changed(..., extraData) 
}) 

Wie kann ich dieses Updates asynchron laufen? Jedes Update greift auf die Datenbank zu, führt Berechnungen durch und ruft changed im Abonnement auf.

Ich muss auch Code ausführen, nachdem alle Updates abgeschlossen sind (resynchronize).

Antwort

4

Speichern Sie den Veröffentlichungshandler einfach und verwenden Sie ihn später!

var publishHandler; 

Meteor.publish('foo', function() { 
    publishHandler = this; 

    //Do stuff... 
}); 

//Later, retrieve it and do stuff with it 
doSomeAsync(Meteor.bindEnvironment(function callback(datum) { 
    publishHandler.changed(/* ... */, datum); 
})); 

//Alternatively with Meteor.setTimeout: 
Meteor.setTimeout(function callback() { 
    publishHandler.changed(/* ... */, 'someData'); 
}, 
10000); 

Da es ein JS Objekt nur am Ende ist können Sie es auch in einem Array speichern oder tun, was zu Ihnen passt.
Asynchron.
Heroisch.