簡體   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