首页 > 解决方案 > 带有 for 循环的异步/等待 | await 仅在 async 函数中有效

问题描述

下面是我试图运行的代码:

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

标签: javascriptnode.jsecmascript-6es6-promise

解决方案


作为我评论的后续行动:verifyExistingUsers没有理由“返回新的承诺”。Node 会自行将您的 return 语句包装在一个 Promise 中,因为该函数是“异步”的。

这里的原始错误是因为您实际上无法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
           }
       }
}

推荐阅读