Existuje několik způsobů, jak dosáhnout toho, co chcete.
1. Používání dotazů Mongoose
V této strategii vaše funkce vrací dotaz Mongoose, který můžete později použít k vyvolání metody exec
a použijte jej k získání výsledků.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Pak jej můžete použít jednoduše takto:
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. Používání objektů podobných Mongoose Promise
Moogose poskytuje podporu pro objekty podobné slibům. Jediné, co musíte udělat, je něco podobného tomu, co jsem udělal výše, ale tentokrát vyvoláte exec
metoda bez zpětného volání.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Pak jej můžete použít jednoduše:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Jak je zdůrazněno v sekci komentářů této odpovědi, tyto objekty nejsou ve skutečnosti sliby a to je třeba vzít v úvahu (viz Dotazy nejsou sliby).
3. Pomocí Mongoose Streams
A konečně, Mongoose má také podporu pro streamy a streamy jsou emitory událostí. Můžete tedy získat stream a poté se přihlásit k odběru událostí „data“ a „chyba“. Takhle:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Pak můžete jednoduše udělat:
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);
});
Zdroj, pro budoucí použití.