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

Javascript 使用NodeJS和MySQL,wait/async函数有时并不等待查询完成,javascript,mysql,node.js,Javascript,Mysql,Node.js,我有两个异步函数 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) {

我有两个异步函数

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

这两个查询都返回我需要的内容,但是在大多数情况下,当它们被称为MySQL查询时,要么没有完全返回,要么没有在承诺的范围内返回答案。我是否在代码中遗漏了一些东西,或者我必须延长MySQL超时时间? 下面是我如何在我的代码中调用它们:

for(let i = 0; i < gameList.length; i++){
                sqlPushSteamappid(gameList[i]);
            }
            //sometimes does not return anything
            let steamNameObj = await sqlGetSteamNames();
for(让i=0;i
首先,您应该理解为什么事情会以代码片段中的方式发生

根本不要考虑mysql,这些异步调用的行为与其他调用一样;还要考虑到
for
迭代本身是异步的,这意味着
for
中的所有函数调用都将在不等待前一个函数完成的情况下被调用(即使您
等待它们)<代码>sqlGetSteamNames()
也将在调用所有
sqlPushSteamappid()
之后立即调用(同样,不等待它们完成)

您需要消除执行顺序的不确定性,您可以让
sqlPushSteamappid()
返回一个承诺,并使用
promise.all
()来协调您的请求。因此,首先在Promise.all中输入所有的
sqlPushSteamappid()
,然后在它返回后,您可以像在代码中一样调用
等待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();
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();