Ci sono diversi modi per ottenere ciò che desideri.
In questa strategia, la tua funzione restituisce una query Mongoose che puoi utilizzare in seguito per invocare il metodo exec
e usalo per ottenere i risultati.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Quindi puoi usarlo semplicemente facendo:
var query = getJedisQuery('Obi-wan');
query.exec(function(err,jedis){
if(err)
return console.log(err);
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
Moogose fornisce supporto per oggetti simili a promesse. Tutto quello che devi fare è qualcosa di simile a quello che ho fatto sopra, ma questa volta invochi il exec
metodo senza una richiamata.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Quindi puoi usarlo semplicemente facendo:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Come evidenziato nella sezione commenti di questa risposta, questi oggetti non sono in realtà promesse e questo deve essere preso in considerazione (vedi Le query non sono promesse).
Infine, Mongoose ha anche il supporto per i flussi e i flussi sono emettitori di eventi. Quindi, potresti ottenere uno stream e quindi iscriverti agli eventi "dati" ed "errore". In questo modo:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Quindi puoi semplicemente fare:
var stream = getJedisStream('Anakin');
stream.on('data', function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
stream.on('error', function(error){
console.log(error);
});
Fonte, per riferimento futuro.