繁体   English   中英

使用 NodeJS 和 MySQL,await/async 函数有时不等待查询完成

[英]Using NodeJS and MySQL, await/async functions sometimes not waiting for query to finish

我有两个异步函数,

async function sqlPushSteamappid(appId){
    let tmp;
    let sql='INSERT INTO cleetusbot.tmp (appId) VALUES ('+appId+');';
    tmp = new Promise((res, rej) => {
        global.pool.query(sql, function (err, results, fields) {    
            if(err){
                console.log(err);
            }
        });
    });
    return await tmp;
}

async function sqlGetSteamNames(){
    let tmp;
    let sql='SELECT * FROM cleetusbot.steamGames INNER JOIN tmp ON cleetusbot.steamGames.appId = cleetusbot.tmp.appId;';
    tmp = new Promise((res, rej) => {
        global.pool.query(sql,function (err, results, fields) {    
            if(err){
                console.log(err);
            }
            res(results);
        });
    });
    await tmp;
    return tmp;
}

两者都返回我需要的东西,但是大多数时候当它们被称为 MySQL 查询时,要么没有完全返回,要么没有在 promise 中返回答案。 我的代码中是否遗漏了某些内容,或者我是否必须延长 MySQL 超时时间? 这是我在我的代码中调用它们的方式:

for(let i = 0; i < gameList.length; i++){
                sqlPushSteamappid(gameList[i]);
            }
            //sometimes does not return anything
            let steamNameObj = await sqlGetSteamNames();

首先,您应该了解为什么事情会以它们在您的代码段中的方式发生。

根本不要考虑您的 mysql,这些异步调用的行为与其他任何调用一样; 还要考虑到for迭代本身是异步的,这意味着将调用内部for所有 function 调用,而无需等待前一个完成(即使您await它们)。 sqlGetSteamNames()也将在所有sqlPushSteamappid()被调用后立即被调用(同样,无需等待它们完成)。

您需要摆脱执行顺序的不确定性,您可以让您的sqlPushSteamappid()返回 promise,并使用Promise.all此处的文档)来协调您的请求。 因此,首先在Promise.all中提供所有sqlPushSteamappid() ,然后在它返回后,您可以像在代码中那样调用await sqlGetSteamNames()

工作示例:

const promises = [
    new Promise((resolve, reject) => {
        setTimeout(() => resolve("3 sec passed"), 3000);
    }),
    new Promise((resolve, reject) => {
        setTimeout(() => resolve("2 sec passed"), 2000);
    }),
    new Promise((resolve, reject) => {
        setTimeout(() => resolve("4 sec passed"), 4000);
    })
];

const ending = async () => { setTimeout(() => { console.log("2 sec to finish") }, 1000); }

const start = async () => {
    const results = await Promise.all(promises);
    console.log(results);
    await ending();
}

start();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM