如何等待直到mysql查询完成,然后继续运行脚本?

时间:2019-07-07 18:20:40

标签: javascript mysql node.js

我创建了一个类,其中的构造函数主要由如下所示的mySQL查询声明:

constructor(username) {


        this.mysql = require('mysql');

// create a connection variable with the required details
        this.con = this.mysql.createConnection({
            host: "localhost", // ip address of server running mysql
            user: "root", // user name to your mysql database
            password: "", // corresponding password
            database: "db" // use the specified database
        });

        this.username = username;
        this._password = "";
        this.con.query("SELECT * FROM users WHERE username = ?", this.username, function (err, result, fields) {
            if (err) throw err;
            this._password = result[0].password;
        });
    }

get password() {
        return this._password;
    }

问题是,当我像这样声明类时:

const user= require("./user.js");
let bot = new user("user1");
console.log(user.password();

仅在查询完成后,代码才首先访问get和get undefined。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

您不能使构造函数异步,而Javascript不支持。

您可以做的是创建一个返回用户的异步createUser函数,并修改User类的构造函数以获取从数据库返回的数据。

类似的东西:


class User {
    // Synchronous constructor
    constructor(mysqlData) {
        this._password = mysqlData.password;
    }
}

// Asynchronous create user function
function createUser(name, callback) {

    con.query('your query', [], function (err, result) {
        if (err) return callback(err); // Traditional error-first callback
        const user = new User(result[0]);
        callback(null, user);
    }
}

// Create the user and then do something once the user is created
createUser('user1', function (err, user) {
    if (err) throw err;
    console.log(user.password());
});

不相关的技巧:研究Promises和async / await,它们比回调好用得多。然后,您的createUser函数将类似于以下内容(注意await关键字而不是查询的回调):

async function createUser(name) {
    const result = await con.query('your query', []);
    const user = new User(result[0]);
    return user;
}

然后您可以通过另一个异步函数执行const user = await createUser('user1');(您只能在await内使用async function)。

请记住,要使其正常工作,您需要:

  1. 支持async / await的运行时(Node 7.6+或现代浏览器),或通过Babel转换代码,使其可以在较早的运行时和浏览器中运行。
  2. 一个支持promise的mysql客户端(大多数软件包在npm上都有包装器。)