【问题标题】: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));
      

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 2016-01-16
        • 2018-09-04
        • 1970-01-01
        • 2018-07-30
        相关资源
        最近更新 更多