首页 > 解决方案 > 需要帮助理解 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 下的回调中,但我怎么知道更新完成了?

标签: mysqlnode.js

解决方案


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)
})

推荐阅读