В настоящее время у меня проблемы с синтаксисом async / await. И вот последние 2 дня пытаюсь выяснить почему и наконец решила спросить.

Я пытаюсь запустить функцию cron (тест), которая вызывает асинхронную функцию, которая подключается к базе данных и пытается найти новую информацию о каждой записи с помощью стороннего API.

Каждая функция работает сама по себе, но при их объединении они не выполняются в правильном порядке, и первая функция пропускает оператор ожидания в первой строке (все еще выполняет его).

Вывод выглядит следующим образом (undefined -> записи БД -> результаты api)

Коррет должен выглядеть так (записи БД -> результаты 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;
}}
-1
TheDexter 9 Окт 2021 в 16:38

2 ответа

Лучший ответ

В своей функции checkfornewdata вы смешиваете обещания и обратные вызовы. В своей текущей форме ваша функция возвращается до завершения вызова базы данных. (поэтому console.log(db) возвращает undefined).

Чтобы исправить это, вы можете использовать драйвер mysql, который поддерживает обещания (например, mysql2 ) или перепишите свою функцию следующим образом:

function checkfornewdata() {
    // ...    
    return new Promise((resolve, reject) => {
      connection.query(state , async (err, result) => {
        if (err) {
          return reject(err);
        }
        // ...
        resolve(newusers);
      }
    }
}
2
fardjad 9 Окт 2021 в 13:52

Вам нужно дождаться цикла!

Попробуйте добавить await после оператора for, например:

for await (var i in result){ 
   var checknew= await 3rdpartyapi.getusers(element.id );
   if (element.joinDate> checknew.joinDate){
     newusers.push(element);
   }
}
0
Ghyath Darwish 9 Окт 2021 в 13:49