【问题标题】:How do I wait for a promise to fill and then return a generator function?如何等待 promise 完成然后返回生成器函数?
【发布时间】:2014-08-19 14:00:04
【问题描述】:

我知道这是错误的,但本质上我想这样做

  • 通过 Promise 连接到 db/orm
  • 等待该承诺履行并获得模型(承诺的回报)
  • 使用结果形成中间件生成器函数,将模型放置在请求中

我怀疑这不是最好的方法,所以基本上我有两个问题:

  • 我是否应该重写我的 db/orm 连接到生成器函数(我觉得更符合 koa 风格)
  • 回到最初的问题(因为我确信我不会有机会重写我的所有业务逻辑) - 我如何等待 promise 完成然后返回生成器函数?

这是我糟糕的尝试——没有成功,老实说,我没想到会这样,但我想从编写代码开始,有一些东西可以解决这个问题:

var connectImpl = function() {
  var qPromise = q.nbind(object.method, object);
  return qPromise ; 
}

var domainMiddlewareImpl = function() {
    let connectPromise = connectImpl()
    return connectPromise.then(function(models){
        return function *(next){
            this.request.models = models ;
        }
    })
}

var app = koa()
app.use(domainMiddlewareImpl())

【问题讨论】:

    标签: javascript node.js generator koa


    【解决方案1】:

    根据this,您可以执行以下操作:

    var domainMiddlewareImpl = function() {
        return function *(){
            this.request.models = yield connectImpl();
        };
    };
    

    【讨论】:

    • JavaScript 中 * 的含义是什么?
    • 表示该函数是一个生成器。生成器是 ECMAScript 6 规范中的一个新特性。它已经在某些浏览器和 Node.js 中可用。
    【解决方案2】:

    基于 Hugo 提供的信息的上下文相关答案(谢谢):

     var connectImpl = function() {
         var qPromise = q.nbind(object.method, object);
         return qPromise ; 
     }
    
    
    var domainMiddlewareImpl = function () {
        let models = null ;
        return function *(next) {
            if(models == null){
                //////////////////////////////////////////////////////
                // we only want one "connection", if that sets up a 
                //     pool so be it
                //////////////////////////////////////////////////////
                models = yield connectImpl() ;
            }
            this.request.models = models.collections;
            this.request.connections = models.connections;
            yield next
        };
    };
    

    我的示例 connectImpl 是在 ORM(目前为水线)中设置域模型,连接到数据库(池化),并返回 ORM 模型和数据库连接的承诺。我只希望这种情况发生一次,然后对于通过我的 Koa 中间件的每个请求,将对象添加到请求中。

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多