在Javascript中从回调函数获取变量

在Javascript中从回调函数获取变量,javascript,mysql,node.js,scope,callback,Javascript,Mysql,Node.js,Scope,Callback,所以我在node.js中编写了这个MySQL选择代码。我对js和回调函数非常陌生,如何从全局范围的回调中获取varuId? 我之所以这么做是因为我的函数mysqlselect必须返回uId function mysqlselect(db, data) { let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`; db.query(sql, function (err, result) {

所以我在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
};

不能,因为
db.query
是异步的

但是,您可以返回一个
承诺
,如下所示:

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));
试试这个:

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)
});

Javascript中对数据库的所有查询或对端点的请求等都是异步进程,这意味着它们不会在通常的执行过程中执行。相反,在您的案例中执行流程时,在数据库上完成查询并返回repsonse时,将调用这些回调

现在,您可以在这个场景中使用多种方法来处理变量,但是由于您希望在数据库查询之后立即访问变量,因此可以尝试以下方法

使用/


注意:如果您想返回此变量并尝试在某个地方访问它,您将无法执行此操作,因为
异步
函数将始终返回承诺。您必须等待
异步
函数的
或执行
。然后

这是否回答了您的问题?
// 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;
};