2015-07-28 5 views
7

Ho un abbonamento che, dopo aver chiamato ready(), esegue una serie di aggiornamenti che tirano dati provenienti da altre collezioni:Meteor: asincrono abbonamento aggiornamento

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

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

Come posso eseguire questi aggiornamenti in modo asincrono? Ogni aggiornamento accede al database, esegue alcuni calcoli e chiama changed sull'abbonamento.

Devo anche eseguire il codice dopo che tutti gli aggiornamenti sono terminati (risincronizzazione).

risposta

4

Basta salvare il gestore di pubblicazione e utilizzarlo in un secondo momento!

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

Dal momento che è solo alla fine un oggetto JS è anche possibile salvarlo in un array o fare qualsiasi cosa vi si addice.
In modo asincrono.
Eroicamente.