Kann mir jemand ein Beispiel geben, wie man ein Versprechen mit Mungo verwendet. Folgendes habe ich, aber es funktioniert nicht wie erwartet:
app.use(function (req, res, next) {
res.local('myStuff', myLib.process(req.path, something));
console.log(res.local('myStuff'));
next();
});
und dann in myLib hätte ich so etwas:
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;
};
Irgendwann erwarte ich, dass meine Daten vorhanden sind, aber wie kann ich darauf zugreifen oder darauf zugreifen?
In der aktuellen Version von Mongoose gibt die exec()
-Methode ein Promise zurück, sodass Sie folgende Aktionen ausführen können:
exports.process = function(r) {
return Content.find({route: r}).exec();
}
Wenn Sie die Daten abrufen möchten, sollten Sie sie asynchronisieren:
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.
});
});
Für weitere Informationen über Versprechen gibt es einen wunderbaren Artikel, den ich kürzlich gelesen habe: http://spion.github.io/posts/why-i-am-switching-to-promises.html
Mongoose verwendet bereits Versprechen, wenn Sie exec()
für eine Abfrage aufrufen.
var promise = Content.find( {route : r }).exec();
Mongoose 4.0 bringt einige aufregende neue Funktionen mit: Schemaüberprüfung im Browser, Abfrage der Middleware, Überprüfung bei Aktualisierung und Versprechen für asynchrone Vorgänge .
Mit [email protected] können Sie beliebige Versprechen einlösen
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
Ein weiteres Beispiel mit polyfilling global.Promise
require('es6-promise').polyfill();
var mongoose = require('mongoose');
Sie können dies also einfach später tun
Content
.find({route : r})
.then(function(docs) {}, function(err) {});
Oder
Content
.find({route : r})
.then(function(docs) {})
.catch(function(err) {});
P.S. Mungo 5.
Mongoose 5.0 verwendet standardmäßig native Versprechungen , sofern verfügbar, ansonsten keine Versprechungen. Sie können mit
mongoose.Promise = require('bluebird');
weiterhin eine benutzerdefinierte Versprechungsbibliothek festlegen, mpromise wird jedoch nicht unterstützt.
Ich glaube du suchst
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;
};
Auf dieser Seite: http://mongoosejs.com/docs/promises.html
Der Titel lautet Einfügen Ihrer eigenen Promises-Bibliothek