Jest kilka sposobów na osiągnięcie tego, czego chcesz.
1. Korzystanie z zapytań Mongoose
W tej strategii Twoja funkcja zwraca zapytanie Mongoose, którego możesz później użyć do wywołania metody exec
i użyj go, aby uzyskać wyniki.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Następnie możesz go użyć po prostu wykonując:
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. Korzystanie z obiektów podobnych do obietnicy Mongoose
Moogose zapewnia obsługę obiektów podobnych do obietnicy. Wszystko, co musisz zrobić, to coś podobnego do tego, co zrobiłem powyżej, ale tym razem wywołujesz exec
metoda bez wywołania zwrotnego.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Następnie możesz go użyć, po prostu wykonując:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Jak podkreślono w sekcji komentarzy do tej odpowiedzi, obiekty te w rzeczywistości nie są obietnicami i należy to wziąć pod uwagę (patrz Zapytania nie są obietnicami).
3. Korzystanie ze strumieni Mongoose
Wreszcie, Mongoose obsługuje również strumienie, a strumienie są emiterami zdarzeń. Możesz więc uzyskać strumień, a następnie zasubskrybować zdarzenia „dane” i „błędy”. Tak:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Następnie możesz po prostu zrobić:
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);
});
Źródło, do wykorzystania w przyszłości.