Quelqu'un peut-il me donner un exemple sur la façon d'utiliser une promesse avec une mangouste? Voici ce que j'ai, mais cela ne fonctionne pas comme prévu:
app.use(function (req, res, next) {
res.local('myStuff', myLib.process(req.path, something));
console.log(res.local('myStuff'));
next();
});
puis dans myLib, j'aurais quelque chose comme ça:
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;
};
À un moment donné, je m'attends à ce que mes données soient présentes, mais comment puis-je y accéder ou y accéder?
Dans la version actuelle de Mongoose, la méthode exec()
renvoie une promesse, vous pouvez donc effectuer les opérations suivantes:
exports.process = function(r) {
return Content.find({route: r}).exec();
}
Ensuite, lorsque vous souhaitez obtenir les données, vous devez les faire asynchroniser:
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.
});
});
Pour plus d'informations sur les promesses, il y a un merveilleux article que j'ai récemment lu: http://spion.github.io/posts/why-i-am-switching-to-promises.html
Mongoose utilise déjà des promesses, lorsque vous appelez exec()
sur une requête.
var promise = Content.find( {route : r }).exec();
Notes de version de Mongoose 4.
Mongoose 4.0 apporte de nouvelles fonctionnalités intéressantes: validation de schéma dans le navigateur, middleware de requête, validation à la mise à jour, et promesses d'opérations asynchrones .
Avec [email protected] vous pouvez utiliser toutes les promesses que vous souhaitez
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
Un autre exemple avec le polyfilling global.
require('es6-promise').polyfill();
var mongoose = require('mongoose');
Donc, vous pouvez le faire plus tard
Content
.find({route : r})
.then(function(docs) {}, function(err) {});
Ou
Content
.find({route : r})
.then(function(docs) {})
.catch(function(err) {});
P.S. Mangouste 5.
Mongoose 5.0 utilisera les promesses natives par défaut si disponibles, sinon aucune promesse. Vous pourrez toujours définir une bibliothèque de promesses personnalisée à l'aide de
mongoose.Promise = require('bluebird');
, cependant, mpromise ne sera pas pris en charge.
Je crois que tu cherches
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;
};
Sur cette page: http://mongoosejs.com/docs/promises.html
Le titre est Brancher votre propre bibliothèque Promises