2015-07-28 52 views
0

我从来没有使用promises,并且正在使用我写的express.js/mongo应用程序来探索它们。下面是查询mongo的路线之一,然后将结果设置为render方法参数中的对象的属性(供模板引擎使用)。 我很好奇如何在“承诺”风格using Q中编写此代码。我已经摆弄了大约一个小时,并决定抛出毛巾并问。在Express.js和Mongoose中使用Q promise库

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

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

     }) 
    }) 
}) 

回答

0

如果你没有持久性,它必须建立在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 }); 
     }); 
}); 
+0

你会想要阅读https://github.com/kriskowal/q/wiki/API-Reference#interfacing-with-nodejs-callbacks :-)顺便说一句,延迟是不推荐的,你应该使用'Q. Promise'构造函数。 – Bergi

+0

@Bergi,谢谢你的支持,真相告诉我,我对bluebird/q promise没有多少经验,我很好奇为什么'deferred'在各处都被弃用,我知道bluebird也是如此,对于[mozilla]也是如此(https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred)显然,但无法找到原因为什么 – mido

+1

基本上因为揭示构造函数模式有一个更好,conciser语法(不需要额外的'deferred'变量),并且捕获解析器回调中的异常。 – Bergi

0

你会使用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顺便说一句,因为这可能是一个异步回调,但对于多个事件而不是单个结果。