Ответ 1
Есть несколько способов достичь того, что вы хотите.
1. Использование запросов Mongoose
В этой стратегии ваша функция возвращает запрос 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
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
Наконец, Mongoose также поддерживает потоки, а потоки являются источниками событий. Таким образом, вы можете получить поток, а затем подписаться на события "data" и "error". Как это:
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);
});
Источник, для дальнейшего использования.