繁体   English   中英

Async / Await with for循环| await仅在异步函数中有效

[英]Async/Await with for loop | await is only valid in async function

以下是我尝试运行的代码:

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。 我究竟做错了什么?

作为我的评论的后续行动: verifyExistingUsers没有理由“返回新的承诺”。 Node会将你的return语句自己包装在一个promise中,因为该函数是'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
           }
       }
}

我已经反驳了同样的问题,如果我正确理解你的问题这是你需要的解决方案,你也可以在循环中使用它,我希望这对你有所帮助,如果这不是你的答案,请告诉我更新我的答案

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();

暂无
暂无

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

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