Hay varias formas de lograr lo que quieres.
En esta estrategia, su función devuelve una consulta Mongoose que luego puede usar para invocar el método exec
y utilícelo para obtener los resultados.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Entonces puedes usarlo simplemente haciendo:
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 proporciona soporte para objetos similares a promesas. Todo lo que tienes que hacer es algo similar a lo que hice anteriormente, pero esta vez, invocas el exec
método sin devolución de llamada.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Entonces puedes usarlo simplemente haciendo:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Como se destaca en la sección de comentarios de esta respuesta, estos objetos no son, de hecho, promesas y eso debe tenerse en cuenta (consulte Las consultas no son promesas).
Finalmente, Mongoose también tiene soporte para flujos y los flujos son emisores de eventos. Por lo tanto, puede obtener una transmisión y luego suscribirse a los eventos de 'datos' y 'error'. Así:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Entonces simplemente puede hacer:
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);
});
Fuente, para referencia futura.