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结果,函数按预期工作,它只是在函数调用中不可用.可能是由于呼叫的异步性质.
有两种方法可以做到这一点.在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)
当然,对于错误处理,如果找不到值,你应该拒绝承诺.但是上面的代码应该给你一个关于如何做的关键想法
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |