Il existe plusieurs façons d'obtenir ce que vous voulez.
Dans cette stratégie, votre fonction renvoie une requête Mongoose que vous pourrez ensuite utiliser pour invoquer la méthode exec
et utilisez-le pour obtenir les résultats.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Ensuite, vous pouvez l'utiliser simplement en faisant :
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 prend en charge les objets de type promesse. Tout ce que vous avez à faire est quelque chose de similaire à ce que j'ai fait ci-dessus, mais cette fois, vous invoquez le exec
méthode sans rappel.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Ensuite, vous pouvez l'utiliser en faisant simplement :
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Comme souligné dans la section commentaire de cette réponse, ces objets ne sont en fait pas des promesses et cela doit être pris en compte (voir Les requêtes ne sont pas des promesses).
Enfin, Mongoose prend également en charge les flux et les flux sont des émetteurs d'événements. Ainsi, vous pouvez obtenir un flux, puis vous abonner aux événements « données » et « erreur ». Comme ceci :
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Ensuite, vous pouvez simplement faire :
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);
});
Source, pour référence future.