2012-01-26 98 views
40

有人可以給我一個關於如何使用貓鼬諾言的例子。這裏是我有什麼,但預計其不工作:如何使用貓鼬諾言 - 蒙戈

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; 

}; 

在某些時候,我期待我的數據是存在,但是我怎樣才能訪問它,或者獲取它?

+0

相關閱讀 - http://mongoosejs.com/docs/queries.html –

回答

5

我相信你正在尋找

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

在貓鼬的當前版本中,exec()方法返回一個承諾,這樣你就可以做到以下幾點:

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

然後,當想要得到的數據,你應該使它異步:

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

For mor有關承諾E資料,有一個精彩的文章,我最近讀: http://spion.github.io/posts/why-i-am-switching-to-promises.html

+11

最新版本的mongoose還允許您使用'find()'的結果作爲承諾,而無需調用exec。所以你可以這樣做:'Content.find({route:r})。then(function(content){});' – Jamie

+0

爲什麼使用res.local?你可以直接使用'var a = myLib.process(req.path)' – OMGPOP

+0

@OMGPOP我認爲OP希望在模板中使用promise。是的,你可以直接使用它。 –

28

貓鼬已經使用的承諾,當你在一個查詢調用exec()

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

救了我一天,適用於每個查詢 – Blacksonic

+0

從Mongoose 4.13開始,'find()'已經返回一個promise。不需要調用exec()。 –

-1

使用藍鳥無極庫這樣的:

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

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

這是thenable,如:

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

此答案已過時。貓鼬已經有了本地承諾支持支持,所以不需要Promisify這些方法。 –

+0

這將用於4.0之前的版本 – Antoine

21

Mongoose 4.0 Release Notes

貓鼬4.0帶來了一些令人興奮的新功能:模式驗證瀏覽器中的,查詢中間件,更新驗證,和承諾 異步操作

隨着[email protected]你可以使用你想要

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

貓鼬5。0將默認使用原生承諾如果有的話, 否則沒有承諾。您仍然可以設置使用mongoose.Promise = require('bluebird');定製承諾 庫,但是, mpromise將不被支持。

+0

你可以舉一個本地承諾使用mongoose 5.0的例子嗎? – Martin

+0

貓鼬5.0尚未發佈 –