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

时间:2017-12-10 09:38:50

标签: javascript mysql node.js scope callback

所以我在node.js中编写了这个MySQL select代码。我对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
};

3 个答案:

答案 0 :(得分:1)

你不能,因为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));

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

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

现在,您可以使用多种方法处理此方案中的变量,但由于您希望在数据库查询后立即访问变量,因此可以尝试以下方法。

使用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。您必须在await函数上async或执行.then