繁体   English   中英

将Q promise库与Express.js和Mongoose结合使用

[英]Using Q promise library with Express.js and Mongoose

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

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

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

        })
    })
})

如果您不坚持必须在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具有这种简化方法,因此在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 });
        });
});

您将使用Q.ninvoke获得对该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
    });
});

在这种情况下,诺言没有太多优势。 您不能将它们用于app.get btw,因为这可能是异步回调,但用于多个事件而不是单个结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM