【问题标题】:Using Q promise library with Express.js and Mongoose将 Q Promise 库与 Express.js 和 Mongoose 一起使用
【发布时间】:2015-10-18 14:18:19
【问题描述】:

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

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

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

        })
    })
})

【问题讨论】:

    标签: javascript node.js mongodb promise q


    【解决方案1】:

    您将使用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
        });
    });
    

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

    【讨论】:

      【解决方案2】:

      如果您不坚持必须在 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 });
              });
      });
      

      【讨论】:

      • 你会想要阅读github.com/kriskowal/q/wiki/… :-) 顺便说一句,不推荐使用延迟,你应该使用Q.Promise 构造函数。
      • @Bergi,感谢您的提醒,说实话,我对 bluebird/q 承诺没有太多经验,我很好奇为什么 deferred 到处被弃用,我知道蓝鸟也是如此,显然mozilla 也是如此,但找不到原因
      • 基本上是因为显示构造函数模式具有更好、更简洁的语法(不需要额外的deferred 变量),并且还可以从解析器回调中捕获异常。
      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2012-04-01
      • 1970-01-01
      • 2014-02-13
      • 2017-09-03
      相关资源
      最近更新 更多