【问题标题】:Getting a variable from a callback function in Javascript从Javascript中的回调函数获取变量
【发布时间】:2018-05-24 01:40:10
【问题描述】:
所以我在 node.js 中编写了这个 MySQL 选择代码。我对 js 和回调函数很陌生,如何在全局范围内从回调中获取 var uId?
我正在尝试这样做,因为我的函数 mysqlselect 必须返回 uId。
function mysqlselect(db, data) {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) throw err;
let uId = result[0].id;
});
// I want to be able to return uId here
};
【问题讨论】:
标签:
javascript
mysql
node.js
scope
callback
【解决方案1】:
Javascript 中对数据库的所有查询或对端点的请求等都是异步进程,这意味着它们不会在通常的执行过程中执行。相反,当在您的情况下执行流程时,当在数据库上完成查询并返回响应时,将调用这些回调
现在,您可以在这种情况下使用多种方法来处理变量,但由于您想在数据库查询后立即访问变量,您可以尝试以下方法。
使用ASYNC / AWAIT
// YOU CAN USE AWAIT ONLY INSIDE AN ASYNC FUNCTION
async function mysqlselect(db, data) {
const uIdPromise = return newPromise((resolve, reject) => {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) reject(err);
resolve(result[0].id);
});
})
// You can access uId right away here.
const uId = await uIdPromise;
};
注意:如果您想返回此变量并尝试在某个地方访问它,您将无法做到这一点,因为async 函数将始终返回一个 Promise。您必须在 async 函数上使用 await 或执行 .then
【解决方案2】:
试试这个:
function mysqlselect(db, data, callback) {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) callback(err, null);
let uId = result[0].id;
callback(null, uId);
});
};
那么你可以这样称呼它:
mysqlselect(db, data, function (err, uId) {
if (err) throw err;
console.log(uId)
});
【解决方案3】:
你不能,因为db.query 是异步的。
但是,您可以返回 Promise,如下所示:
function mysqlselect(db, data) {
return new Promise((resolve, reject) => {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) reject(err);
let uId = result[0].id;
resolve(uId);
});
});
};
然后你可以像这样使用它:
mysqlselect(db, data).then((id) => console.log(id));