Как использовать мангустский обещание - монго
Может кто-нибудь дать мне пример о том, как использовать обещание с мангуста. Вот что у меня есть, но он не работает, как ожидалось:
app.use(function (req, res, next) {
res.local('myStuff', myLib.process(req.path, something));
console.log(res.local('myStuff'));
next();
});
а затем в myLib, у меня будет что-то вроде этого:
exports.process = function ( r, callback ) {
var promise = new mongoose.Promise;
if(callback) promise.addBack(callback);
Content.find( {route : r }, function (err, docs) {
promise.resolve.bind(promise)(err, docs);
});
return promise;
};
В какой-то момент я ожидаю, что мои данные будут присутствовать, но как я могу получить к нему доступ или получить его?
Ответы
Ответ 1
В текущей версии Mongoose метод exec()
возвращает Promise, поэтому вы можете сделать следующее:
exports.process = function(r) {
return Content.find({route: r}).exec();
}
Затем, когда вы хотите получить данные, вы должны сделать это async:
app.use(function(req, res, next) {
res.local('myStuff', myLib.process(req.path));
res.local('myStuff')
.then(function(doc) { // <- this is the Promise interface.
console.log(doc);
next();
}, function(err) {
// handle error here.
});
});
Для получения дополнительной информации о promises, есть замечательная статья, которую я недавно прочитал:
http://spion.github.io/posts/why-i-am-switching-to-promises.html
Ответ 2
Mongoose уже использует promises, когда вы вызываете exec()
в запросе.
var promise = Content.find( {route : r }).exec();
Ответ 3
Заметки о выпуске Mongoose 4.0
Mongoose 4.0 предлагает новые интересные функции: проверка схемы в браузере, промежуточное ПО запроса, проверка на обновление, и promisesдля асинхронных операций.
С помощью [email protected] вы можете использовать любой promises, который вы хотите
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
Другой пример с polyfilling global.Promise
require('es6-promise').polyfill();
var mongoose = require('mongoose');
Итак, вы можете просто сделать это позже
Content
.find({route : r})
.then(function(docs) {}, function(err) {});
или
Content
.find({route : r})
.then(function(docs) {})
.catch(function(err) {});
P.S. Mongoose 5.0
Mongoose 5.0 будет использовать собственный promises по умолчанию, если он доступен, иначе нет promises. Вы по-прежнему сможете установить пользовательский promisesбиблиотека, использующая mongoose.Promise = require('bluebird');
, однако, mpromise не будет поддерживаться.
Ответ 4
Я считаю, что вы ищете
exports.process = function ( r, callback ) {
var promise = new mongoose.Promise;
if(callback) promise.addBack(callback);
Content.find( {route : r }, function (err, docs) {
if(err) {
promise.error(err);
return;
}
promise.complete(docs);
});
return promise;
};
Ответ 5
На этой странице: http://mongoosejs.com/docs/promises.html
Заголовок Подключается к вашей собственной библиотеке Promises
Ответ 6
Используйте библиотеку Promise bluebird следующим образом:
var Promise = require('bluebird');
var mongoose = require('mongoose');
var mongoose = Promise.promisifyAll(mongoose);
User.findAsync({}).then(function(users){
console.log(users)
})
Это можно использовать, например:
User.findAsync({}).then(function(users){
console.log(users)
}).then(function(){
// more async stuff
})