2012-01-26 15 views
40

Czy ktoś może mi podać przykład, jak używać obietnicy z mangustą? Oto co mam, ale jej nie działa zgodnie z oczekiwaniami:Jak używać mangusty Obietnica - mongo

app.use(function (req, res, next) { 
    res.local('myStuff', myLib.process(req.path, something)); 
    console.log(res.local('myStuff')); 
    next(); 
}); 

a potem w myLib, chciałbym mieć coś takiego:

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; 

}; 

w pewnym momencie spodziewam moje dane do obecności , ale w jaki sposób mogę uzyskać do niego dostęp lub uzyskać do niego dostęp?

+0

Stosowna odczytu - http://mongoosejs.com/docs/queries.html –

Odpowiedz

5

wierzę szukasz

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; 

}; 
44

W obecnej wersji Mangusta, metoda exec() zwraca obietnicę, dzięki czemu można wykonać następujące czynności:

exports.process = function(r) { 
    return Content.find({route: r}).exec(); 
} 

Wtedy, kiedy chcesz uzyskać dane, powinieneś zrobić to asynchronicznie:

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. 
     }); 
}); 

Za e informacje o obietnicach, jest to wspaniały artykuł, który niedawno przeczytać: http://spion.github.io/posts/why-i-am-switching-to-promises.html

+11

Najnowsza wersja mangusty pozwala również użyć wyniku 'find()' jako obietnicy, bez konieczności wywoływania 'exec'. Więc możesz po prostu zrobić: 'Content.find ({route: r}). Then (function (content) {});' – Jamie

+0

dlaczego używasz res.local? czy możesz bezpośrednio użyć 'var a = myLib.process (req.path)' – OMGPOP

+0

@OMGPOP Myślę, że OP chciał użyć obietnicy w szablonach. Tak, możesz użyć tego bezpośrednio. –

28

Mongoose korzysta już obietnice, kiedy zadzwonić exec() na zapytania.

var promise = Content.find({route : r }).exec(); 
+3

zapisane mój dzień, działa dla każdego zapytania – Blacksonic

+0

Od Mongoose 4.13, 'find()' już zwraca obietnicę. Nie trzeba wywoływać 'exec()'. –

-1

Użyj Bluebird Obietnica bibliotekę takiego:

var Promise = require('bluebird'); 
var mongoose = require('mongoose'); 
var mongoose = Promise.promisifyAll(mongoose); 

User.findAsync({}).then(function(users){ 
    console.log(users) 
}) 

To thenable, takich jak:

User.findAsync({}).then(function(users){ 
     console.log(users) 
    }).then(function(){ 
     // more async stuff 
    }) 
+0

Ta odpowiedź jest nieaktualna. Mongoose ma już wsparcie dla wsparcia obietnic, więc nie ma potrzeby promowania metod. –

+0

To byłoby dla wersji wcześniejszych niż 4.0 – Antoine

21

Mongoose 4.0 Release Notes

Mongoose 4.0 przynosi kilka ciekawych funkcjonalności : sprawdzanie schematu w przeglądarce, oprogramowanie pośredniczące do zapytań, sprawdzanie poprawności aktualizacji, i obiecuje dla operacji asynchronicznych.

Z [email protected] można używać żadnych obietnic, które chcesz

var mongoose = require('mongoose'); 
mongoose.Promise = require('bluebird'); 

Innym przykładem z polyfilling global.Promise

require('es6-promise').polyfill(); 
var mongoose = require('mongoose'); 

Tak, można po prostu zrobić później

Content 
    .find({route : r}) 
    .then(function(docs) {}, function(err) {}); 

lub

Content 
    .find({route : r}) 
    .then(function(docs) {}) 
    .catch(function(err) {}); 

P.S. Mongoose 5.0

Mongoose 5.0 będzie domyślnie używać natywnych obietnic jeśli są dostępne, inaczej nie ma obietnic. Nadal będziesz mieć możliwość ustawienia niestandardowej biblioteki obietnic przy użyciu mongoose.Promise = require('bluebird');, jednak mpromise nie będzie obsługiwane.

+0

czy mógłbyś podać przykład natywnego wykorzystania obietnicy z mangiem 5.0? – Martin

+0

Mongoose 5.0 nie został jeszcze wydany –