将Q promise库与Express.js和Mongoose一起使用

时间:2015-07-28 06:55:55

标签: javascript node.js mongodb promise q

我从未使用过promises,而是使用我编写的express.js / mongo应用程序来探索它们。下面是查询mongo然后将结果设置为render方法参数中对象的属性的路由之一(由模板引擎使用)。 我很好奇如何用“承诺”风格using Q来写这个。我已经摆弄了大约一个小时,决定放弃并问。

app.get("/", function(req, res) {
    Comment.find(function(err, item) {

        res.render("index", {
            comment: item

        })
    })
})

2 个答案:

答案 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,因为它可能是异步回调,但对于多个事件而言,不是单个结果。