2014-12-01 9 views
6

sto lavorando a un progetto Meteor e devo dire che non è affatto facile, soprattutto per una cosa: le richiamate!Meteor: non più richiamate per la funzione "findOne"

Tutto è asincrono, quindi mi chiedo come devo fare per ottenere i risultati dal mio mongodb.

var user = Meteor.users.findOne({username: "john"}); 
return (user); // sometimes returns "undefined" 

...

var user = Meteor.users.findOne({username: "john"}); 
if (user)     // so ok, I check if it exists! 
    return (user);   // Cool, I got my user! 
return();     // Ok and what should I return here? I want my user! 

Non voglio essere sporco e mettere come setTimeout ovunque. Qualcuno ha una soluzione per questo?


EDIT: ho notato in router.js con console.log che il mio dati vengono restituiti 4 volte. 2 volte con un valore non definito e altre 2 volte con il valore previsto. Nella vista, è ancora indefinito. Perché il router passa 4 volte in questo percorso? Mostra il primo risultato del valore di ritorno nel router?

Cosa devo restituire se find() non trova nulla?


EDIT 2: Ecco il codice per capire.

this.route('profilePage', { 
    path: 'profil/:_id?', 
    waitOn: function() { 
     return [ 
     Meteor.subscribe('article', { prop: this.params._id}), // id can be id or username 
     Meteor.subscribe('article', { userId: this.params._id}), // id can be id or username 
     Meteor.subscribe('params'), 
     Meteor.subscribe('profil', (this.params._id ? this.params._id : Meteor.userId())) 
     ]; 
    }, 
    data: function() { 
     if (this.params._id) { 
      var user = Meteor.users.findOne(this.params._id); 
      if (!user) 
       user = Meteor.users.findOne({username: this.params._id}); 
      console.log(user); 
      return user; 
     } 
     else if (Meteor.userId()) 
      return Meteor.user(); 
     else 
      Router.go("userCreate"); 
    } 
}); 

ottengo questo sulla console: http://puu.sh/debdJ/69419911f7.png

(versione testo riportato di seguito)

undefined 
undefined 
Object_id: "o3mgLcechYTtHPELh"addresses: (....) 
Object_id: "o3mgLcechYTtHPELh"addresses: (....) 
+1

Sono abbastanza sicuro che 'findOne' non è asincrono e il tuo primo esempio dovrebbe andare bene. Presumo che tu stia facendo questo sul client, vuoi essere sicuro che l'utente che stai cercando si trovi nella tua raccolta lato client. Nella console del tuo browser esegui 'Meteor.users.findOne ({username:" john "})' e questo dovrebbe togliere la sincronizzazione dalla domanda. – Shaded

+0

findOne dovrebbe essere sincrono e reattivo. Stai dicendo che a volte ritorna indefinito anche quando la query deve restituire un valore? Nota, generalmente uso findOne con un _id in modo che possa essere parte del motivo per cui provo un comportamento diverso. –

+0

@LarryMaccherone Sì, è tutto. Restituisce indefinito dove dovrebbe restituire qualcos'altro. E ho notato con console.log che i miei dati in routes.js vengono restituiti 4 volte: 2 volte con undefined e 2 volte con l'oggetto che mi aspetto. Ma nella vista, l'oggetto non è definito. – Sw0ut

risposta

4

findOne(yourId) è un metodo di sincronizzazione che è equivalente a find({ _id: yourId}, callback). La differenza è che find() consente di definire un callback. Se non si passa una richiamata a find(), questo metodo sarà sincronizzato.

controllo wrapAsync: http://docs.meteor.com/#/full/meteor_wrapasync Esso consente di codificare in uno stile sync con async operazioni.

lezione

gratuito in EventedMind: https://www.eventedmind.com/feed/meteor-meteor-wrapasync

+0

Ciao e grazie. Ti terrò aggiornato sperimentando questo domani al lavoro. – Sw0ut

+0

Ora su Meteor 1.0, find non ha più il callback. Controlla la mia modifica per favore. – Sw0ut

0

La mia esperienza finora è che il pacchetto Meteor MongoDB è che le funzioni non forniscono generalmente callback (per qualche ragione inserto fa ...), le funzioni sono atomiche (quindi sync).

Ci sono pacchetti di meteore che possono rendere Mongodb asincrono se lo si desidera (non ho provato nessuno).

Immagino che questo approccio di sincronizzazione sia in linea con il semplice obiettivo di manutenzione di Mongodb. Pensandoci, uno dei miei animaletti che usano Node sta lavorando con cascate/nidi di callback asincroni, è un dolore da creare e mantenere ... e spero che questo renderà il mio codice più facile da leggere e capire e modificare ...

0
var future = new Future(); 

var _h = Hunts.findOne({huntId}); 

if(_h) { 
     future.return(_h) 
    } else { 
     return future.wait(); 
    } 

sul server/startup.js necessario: Future = Npm.require ('fibre/future');

Problemi correlati