如果你没有持久性,它必须建立在q
做,你可以使用bluebird
和promisify:
var Promise = require("bluebird");
Promise.promisifyAll(Comment);
app.get("/", function(req, res) {
Comment.find() // now this is already a promisified method
.then(function(item){
res.render("index", { comment: item });
}).catch(function(err){
res.render('error', { error: err });
});
});
我不认为q
有这样promisification的方法,因此,在Q使用deferred
:
var Q = require("q");
app.get("/", function(req, res) {
var deferred = Q.defer();
Comment.find(function(err, item) {
if(err) return deferred.reject(error);
deferred.resolve(item);
});
deferred.promise
.then(function(item){
res.render("index", { comment: item });
}).catch(function(err){
res.render('error', { error: err });
});
});
你会想要阅读https://github.com/kriskowal/q/wiki/API-Reference#interfacing-with-nodejs-callbacks :-)顺便说一句,延迟是不推荐的,你应该使用'Q. Promise'构造函数。 – Bergi
@Bergi,谢谢你的支持,真相告诉我,我对bluebird/q promise没有多少经验,我很好奇为什么'deferred'在各处都被弃用,我知道bluebird也是如此,对于[mozilla]也是如此(https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred)显然,但无法找到原因为什么 – mido
基本上因为揭示构造函数模式有一个更好,conciser语法(不需要额外的'deferred'变量),并且捕获解析器回调中的异常。 – Bergi