承诺mysql返回undefined,如何让函数等待结果

Sud*_*eej -4 javascript mysql callback node.js promise

我正在尝试编写一个模块,该模块根据传递给函数的密钥从MySQL数据库返回一个值.

以下代码在独立测试时工作正常,我能够得到结果,但是当我尝试从函数调用得到结果时,我得到了未定义.

var value = getKey("tc_api_user_key");
Run Code Online (Sandbox Code Playgroud)

我怀疑它是由于返回声明.我应该如何让调用函数等待结果.

var mysql = require('promise-mysql')
    , dbConnect = require('../connection.js')
    , fs = require('fs')
    , select = fs.readFileSync(__dirname + '/queries/getallkey.sql').toString();

let getKey = (key_id) => {
mysql.createConnection(dbConnect.getConnection()).then(function(conn){
    var result = conn.query(select);
    conn.end();
    return result;
}).then(function(rows){
    // Logs out a list of hobbits
         Object.keys(rows).forEach(function(key) {
                    var item = rows[key];
                      if (key_id == item.key_id) {
                           return item.key_value;
                      }
                    });
});

}    

 var value = getKey("tc_api_user_key");
 console.log(value) 
Run Code Online (Sandbox Code Playgroud)

这个问题不是conn.query(),如果使用console.out结果,函数按预期工作,它只是在函数调用中不可用.可能是由于呼叫的异步性质.

Tar*_*ani 5

有两种方法可以做到这一点.在async这样或那样promise的方式.

异步方式

let getKey = async (key_id) => {
  let conn = await mysql.createConnection(dbConnect.getConnection())
  let rows = conn.query(select);
  conn.end();
  for ([key, item] of Object.entries(rows))
  {
    if (key_id == item.key_id)
      return item.key_value;
  }
}

async function do() {
  var value = await getKey("tc_api_user_key");
  console.log(value)
}

do()
Run Code Online (Sandbox Code Playgroud)

承诺的方式

在此,当您想要返回您解决承诺的值时,返回Promise并在promise中.

let getKey = (key_id) => {
    return new Promise( (resolve) =>
    mysql.createConnection(dbConnect.getConnection()).then(function (conn) {
        var result = conn.query(select);
        conn.end();
        return result;
    }).then(function (rows) {
        for ([key, item] of Object.entries(rows))
        {
            if (key_id == item.key_id) {
                resolve(item.key_value);
                break;
            }
        }
    })
    );
};

getKey("tc_api_user_key").then(value => {
    console.log(value)
});
Run Code Online (Sandbox Code Playgroud)

当然,对于错误处理,如果找不到值,你应该拒绝承诺.但是上面的代码应该给你一个关于如何做的关键想法

  • 你能解释一下你不是在寻找什么吗? (4认同)