mysql - 需要帮助理解 mysql 查询的异步/承诺
问题描述
var mysql = require('mysql');
var con = mysql.createConnection({
host: "host",
user: "login",
password: "password",
database: "db"
});
con.connect(function (err) {
if (err) throw err;
console.log("Connected!");
function addTalentPoint(id,amount){
var sql = "SELECT RegValue FROM `Registry` WHERE RegChaId="+id+" AND RegIdentifier='TalentPoints'"
var endingTalentPoint = 0;
con.query(sql, function (err, result) {
if (err) throw err;
console.log("Starting Talent Point: "+result[0].RegValue);
endingTalentPoint = result[0].RegValue + amount
var sql = "UPDATE `Registry` SET RegValue="+endingTalentPoint+" WHERE RegChaId="+id+" AND RegIdentifier='TalentPoints'"
con.query(sql, function (err, result) {
if (err) throw err;
console.log(endingTalentPoint)
});
});
}
function getTalentPoint(id){
var sql = "SELECT RegValue FROM `Registry` WHERE RegChaId="+id+" AND RegIdentifier='TalentPoints'"
con.query(sql, function (err, result) {
if (err) throw err;
console.log("get talent point: "+result[0].RegValue);
});
}
addTalentPoint(4,5)
getTalentPoint(4)
});
我的示例输出:
起始天赋点:125
获得天赋点:125
130
我已经阅读了许多博客并尝试使用 async / await 并设置承诺,但我没有得到我需要的地方。我试图让代码在 getTalentPoint 执行之前等待 addTalentPoint 完成。它发送查询然后继续执行代码是否只是野兽的本性?我可以将 getTalentPoint 放在 UPDATE 下的回调中,但我怎么知道更新完成了?
解决方案
addTalentPoint
仍在做异步的事情-所有这些con.query
调用都是异步的-因此,除非您在回调中进行工作,否则事情将立即执行(就像您的getTalentPoint
函数一样)-一种解决方案是向函数添加回调addTalentPoint
函数。请参阅以下更改:
//First, add a callback parameter
function addTalentPoint(id,amount,callback){
...
//next, use this callback when the work is done
if (err) throw err;
console.log(endingTalentPoint)
if (callback) callback(); //if a callback exists, call it
现在,使用你的新参数:
addTalentPoint(4,5, function() {
//All done doing the work in addTalentPoint, lets do more things now!
getTalentPoint(4)
})
推荐阅读
- java - 带有破折号和空格的 Java 正则表达式拆分字符串
- java - 什么时候使用 TreeSet 比使用 HashSet 更快?
- oracle - 单行中的多行数据以逗号分隔(Oracle)
- flutter - “Null”类型不是“List”类型的子类型
'函数结果' - javascript - 试图根据无效的表单输入显示错误消息
- openstreetmap - 如何通过任何值的标签查询立交桥涡轮?
- android - 反应本机查询的预填充领域数据库
- r - 如何将混合数字和日期格式转换为单数格式
- python - 为什么我在使用时间模块的这两个定时器功能中得到不同的输出?
- terraform - Terraform:获取模块名称以将其从路径注入到其他模块