Er zijn verschillende manieren om te bereiken wat je wilt.
In deze strategie retourneert uw functie een Mongoose-query die u later kunt gebruiken om de methode exec
aan te roepen en gebruik het om de resultaten te krijgen.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Dan kun je het gewoon gebruiken door:
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 biedt ondersteuning voor belofte-achtige objecten. Het enige dat u hoeft te doen is iets dat enigszins lijkt op wat ik hierboven heb gedaan, maar deze keer roept u de exec
op methode zonder terugbellen.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Dan kun je het gebruiken door simpelweg het volgende te doen:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Zoals benadrukt in het commentaargedeelte van dit antwoord, zijn deze objecten in feite geen beloften en daar moet rekening mee worden gehouden (zie Vragen zijn geen beloften).
Ten slotte heeft Mongoose ook ondersteuning voor streams en streams zijn gebeurteniszenders. U kunt dus een stream krijgen en u vervolgens abonneren op 'data'- en 'error'-gebeurtenissen. Zoals dit:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Dan kunt u eenvoudig het volgende doen:
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);
});
Bron, voor toekomstig gebruik.