我如何等待承诺填充然后返​​回生成器功能?

时间:2014-08-19 14:00:04

标签: javascript node.js generator koa

我知道这是错的,但基本上我想要

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

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

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

这是我糟糕的尝试 - 这是行不通的,老实说,我没想到它,但我想从编写代码开始,有一些工作来解决这个问题:

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())

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

基于Hugo(thx)提供的信息的上下文敏感答案:

 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中间件对每个请求,将对象添加到请求中。