我有一个Game
类,属性为id、player 1和player 2。我想写一个方法从mySql数据库中获取数据,并相应地设置对象属性。
Object在另一个名为index.js的文件中初始化。
我的问题是,在我调用saveData(data)
方法之前,查询没有完成执行。我如何解决这个问题?有没有更好的方法来实现这种行为?
Game.js:
const db = require('../mySqlConnection');
class Game{
constructor(){
this.id = null;
this.player1 = null;
this.player2 = null;
}
saveData(data) {
this.id = data.id;
this.player1 = data.player1;
this.player2 = data.player2;
}
fetchGame(id){
const q = "SELECT * FROM `games` WHERE `id`= `id`"
db.query(q, (err, data)=\>{
if(err) return conssole.log(err)
this.saveData(data)
})
}
}
module.exports = Game
index.js:
const Game = require('./components/game')
var firstGame = new Game()
firstGame.fetchGame(1)
console.log("index.js: " +JSON.stringify(firstGame))
console.log()的输出:index.js: {"id":null,"player1":null,"player2":null}
console.log()的预期输出:index.js: {"id":"1","player1":"name1","player2":"name2"}
**编辑:**我用promises和async/await实现了这个功能,如另一个问题所示:如何在不返回任何数据的情况下操作promise中的对象属性?
3条答案
按热度按时间lf5gs5x21#
这是一个异步获取的问题。像这样设计你的
fetchGame
方法:像这样调用函数:
使用async await:
像这样调用函数:
mf98qq942#
在您的查询中
我不认为
id
会被传递到函数中的id
替换。另外,我建议在这里添加
console.log
:这将有助于识别
data
的结构,如预期的那样,并填充数据。如果有帮助就告诉我。
7gs2gvoe3#
我对这个问题不是很有经验,但出于不同的原因,我确实对此有一些兴趣。
根据你的问题和我的一点点知识,我相信这可以用JS promise解决。
也许像这样的东西(语法可能是错误的或不完整的,但可能作为隧道中的一盏灯-我想)。
在下面的网站中有很多例子:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://www.w3schools.com/js/js_promise.asp