我创建了一个类,其中的构造函数主要由如下所示的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。
我该如何解决?
答案 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
)。
请记住,要使其正常工作,您需要: