Async / Await с для цикла |await действителен только в асинхронной функции - PullRequest
0 голосов
/ 23 февраля 2019

Ниже приведен код, который я пытаюсь запустить:

async function verifyExistingUsers(db, users) {
    return new Promise((resolve, reject) => {

       var companies = []
       for (const [index, user] of users.entries()) {

           let company = await getUserCompany(db, user)
           companies.push(company) 

           if (index === users.length-1) {
               resolve(companies)
           }
       }
   })
}

async function getUserCompany(db, user) {
    return new Promise((resolve, reject) => {
        db.Company.findAll({
            where: {
                id: user.id,
            }
        }).then(company => {
            resolve(company)
        })
    }).catch(error => {
        reject()
    })
}

Я получаю следующую ошибку:

let companies = await getUserCompany(db, user)
                ^^^^^
SyntaxError: await is only valid in async function

Я не могу использовать forEach, потому что мне нужноawait.

Новое в JavaScript.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Я столкнулся с той же проблемой, если я правильно понимаю ваш вопрос, это решение, которое вам нужно, и вы также можете использовать его в циклах, я надеюсь, что это поможет вам, если это не ваш ответ, просто скажите мне обновить мойответ

const AsyncFuncion = async () => {
  let interval = 2000;
  const delayPromise = (data, delayDuration) => {
    return new Promise((resolve) => {
      setTimeout(() => {
            // here you can do your operations on db
          resolve();
      }, delayDuration)
    });
  };


  try {
    const userData = // the data you want from db or you can use http request to get that data
    const promises = userData.map((data, index) => delayPromise(data, index * interval));
    await Promise.all(promises);
    setTimeout(function(){
      console.log('done') // after 10 minitues it'll repeate it self you can disable it also
      AsyncFuncion()
    }, 1000 * 60 * 10)
  } catch (e) {
    console.error('AsyncFuncion', e);
  }
}

AsyncFuncion();
0 голосов
/ 23 февраля 2019

Как продолжение моего комментария: verifyExistingUsers не имеет причин «возвращать новое обещание».Узел самостоятельно обернет ваш оператор возврата в обещание, потому что функция 'async'.

Первоначальная ошибка здесь заключается в том, что вы фактически не можете использовать await в анонимной, не асинхронной функции, ((resolve, reject) => {}).

Вместо того, чтобы возвращать новое обещание, вы просто вернете нужную переменную, когда закончите помещать данные в массив.Сделав это и объявив функцию как «асинхронную», Node обернет ваше возвращаемое значение обещанием, которое вы ждете где-то еще.

async function verifyExistingUsers(db, users) {
       var companies = []
       for (const [index, user] of users.entries()) {

           let company = await getUserCompany(db, user)
           companies.push(company) 

           if (index === users.length-1) {
               return companies; //effectively returns a promise that resolves to companies
           }
       }
}
...