如何从promise到main函数获取数据

时间:2017-03-30 09:01:09

标签: javascript node.js async-await

我有功能:

function find(id){

    var res = this.db.query(this.knex(this.table).where({id:id}).select().toString());

    var props = {};

    for(var c in res.rows[0]){
        if(res.rows[0].hasOwnProperty(c))
            props[c] = res.rows[0][c];
    }

    return this.newRecord(props);

}

this.db这里是来自pg.Client npm模块的pg对象。 knex也是一个npm模块,它构建了对postgresql数据库的查询。 它返回promise,我需要从这个promise中获取数据到main函数,从这个数据创建对象并返回它(newRecord函数就可以了。)

我已经尝试安装节点版本7并使用await,但这没有用,因为如果函数有async修饰符,那么它将返回带有return之后的对象的promise,而我根本不需要这种行为。

所以,问题是我是如何等待该承诺完成并从中获取数据,有或没有async/await或任何其他es6或es7功能?

1 个答案:

答案 0 :(得分:0)

Pg客户端查询方法似乎是异步函数(因为主函数不等待查询将值返回到res然后继续进行)。那么,你应该做的是将回调函数传递给你的查询方法,如下所示 -

function find(id){
    var res;
   this.db.query(this.knex(this.table).where({id:id}).select().toString(), function(err, result) {
      if(!err){
        console.log("Result is - " + result);
        res = result //if its an array, use res = result.splice();
        
         var props = {};

      for(var c in res.rows[0]){
        if(res.rows[0].hasOwnProperty(c))
            props[c] = res.rows[0][c];
     }

     return this.newRecord(props);

      }
      else {
        console.error("Error occured -" + err);
      }
    }
    );

   
});