我从未使用过promises,而是使用我编写的express.js / mongo应用程序来探索它们。下面是查询mongo然后将结果设置为render方法参数中对象的属性的路由之一(由模板引擎使用)。 我很好奇如何用“承诺”风格using Q来写这个。我已经摆弄了大约一个小时,决定放弃并问。
app.get("/", function(req, res) {
Comment.find(function(err, item) {
res.render("index", {
comment: item
})
})
})
答案 0 :(得分:0)
如果你不能坚持它必须在q
上完成,你可以使用bluebird
并宣传:
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 });
});
});
答案 1 :(得分:0)
您使用Q.ninvoke
来获取 [self dismissViewControllerAnimated:true completion:nil];
的承诺:
item
现在你可以将var itemPromise = Q.ninvoke(Comment, "find");
链接到那个 - 基本上附加两个回调:
.then
在这种情况下,承诺没有很多优势。您不能将它们用于itemPromise.then(function(item) {
// success case
res.render("index", {
comment: item
});
}, function(err) {
// error case
res.render("index", {
comment: undefined // reflecting your original code, but hardly what you want
});
});
btw,因为它可能是异步回调,但对于多个事件而言,不是单个结果。