Javascript 我如何等待承诺完成,然后返回生成器函数?

Javascript 我如何等待承诺完成,然后返回生成器函数?,javascript,node.js,generator,koa,Javascript,Node.js,Generator,Koa,我知道这是错误的,但本质上我想 通过promise连接到db/orm 等待承诺兑现并获得模型(承诺的回报) 使用form a middleware generator函数的结果在请求中放置模型 我怀疑这不是最好的方法,因此我有两个问题: 我应该重写DB/ORM连接到生成器函数(我有一种感觉,和膝关节炎的样式更内联) 回到最初的问题(因为我确信我不会有机会重写我所有的业务逻辑)-我如何等待承诺兑现,然后返回生成器函数 这是我拙劣的尝试——它不起作用,老实说,我没想到它会起作用,但我想从编写

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

  • 通过promise连接到db/orm
  • 等待承诺兑现并获得模型(承诺的回报)
  • 使用form a middleware generator函数的结果在请求中放置模型
我怀疑这不是最好的方法,因此我有两个问题:

    我应该重写DB/ORM连接到生成器函数(我有一种感觉,和膝关节炎的样式更内联)
  • 回到最初的问题(因为我确信我不会有机会重写我所有的业务逻辑)-我如何等待承诺兑现,然后返回生成器函数
这是我拙劣的尝试——它不起作用,老实说,我没想到它会起作用,但我想从编写代码开始,用一些东西来解决这个问题:

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())
根据,您可以执行以下操作:

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

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


我的示例connectImpl是在ORM中设置域模型(现在是水线),连接到数据库(池),并返回ORM模型和DB连接的承诺。我只希望这一次发生,然后通过我的膝关节炎中间件,对每个请求,将对象添加到请求中。

什么是JavaScript中的意思?这意味着函数是一个生成器。生成器是ECMAScript 6规范附带的一项新功能。它已经在一些浏览器和Node.js中可用。
 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
    };
};