Има няколко начина да постигнете това, което искате.
1. Използване на заявки за мангусти
В тази стратегия вашата функция връща заявка Mongoose, която по-късно можете да използвате, за да извикате метода exec
и го използвайте, за да получите резултатите.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
След това можете да го използвате просто като направите:
var query = getJedisQuery('Obi-wan');
query.exec(function(err,jedis){
if(err)
return console.log(err);
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
2. Използване на подобни на Mongoose Promise обекти
Moogose предоставя поддръжка за подобни на обещания обекти. Всичко, което трябва да направите, е нещо подобно на това, което направих по-горе, но този път извиквате exec
метод без обратно извикване.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
След това можете да го използвате, като просто направите:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Както е подчертано в секцията за коментари на този отговор, тези обекти всъщност не са обещания и това трябва да се вземе предвид (вижте Заявките не са обещания).
3. Използване на Mongoose Streamи
И накрая, Mongoose също има поддръжка за потоци и потоците са източник на събития. Така че можете да получите поток и след това да се абонирате за събития „данни“ и „грешки“. Като това:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
След това можете просто да направите:
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);
});
Източник, за бъдещи справки.