节点Js异步未按正确顺序运行,并跳过承诺



我当前在async/await语法方面遇到问题。在过去的两天里,我一直在努力找出原因,最终决定问一下。

我正在尝试运行一个cron函数(测试),该函数调用一个连接到数据库的异步函数,并尝试使用第三方API查找有关每个条目的新信息。

每个函数都有自己的功能,但在组合它们时,它们的运行顺序不正确,第一个函数跳过第一行的await语句。(仍然执行)

输出如下所示(未定义->DB条目->api结果)

corret应该看起来像(DB条目->api结果->最终结果)

async function test() {
var db = await checkfornewdata() // executes 
console.log(db) //skips line one and returns undefined as it didnt get its value
}
async function checkfornewdata()
{

var state = `SELECT * FROM users`;
var users= []
var newusers
console.log('Get connection ...');
connection.query(state , async function (err,result) {
if(err) throw err;
users= result
console.log('Query Result')
console.log(result) //works without problems
for (var i in result){ 
var checknew= await 3rdpartyapi.getusers(i.id );
if (i.joinDate> checknew.joinDate){
newusers.push(i);
}
console.log('New entries:')
console.log(newusers)
connection.end()
return newusers;
}
async function getusers(id)
{
var joinDate;   
if (typeof(id) !== 'undefined'){
console.log("getting joinDate of " + id)
await 3rdpartyapi.getUser(id).then(User => {    

joindate= User.joinDate;
console.log(joinDate)   //last output i recieve
})
.catch((err) => {

console.log(err)    
return err;
})
return joinDate;
}}

checkfornewdata函数中,您混合了promise和callback。在当前形式中,函数在对数据库的调用完成之前返回。(这就是console.log(db)返回undefined的原因)。

为了解决这个问题,您可以使用支持promise的mysql驱动程序(如mysql2),或者像这样重写您的函数:

function checkfornewdata() {
// ...    
return new Promise((resolve, reject) => {
connection.query(state , async (err, result) => {
if (err) {
return reject(err);
}
// ...
resolve(newusers);
}
}
}