javascript - 带有 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 新手。我究竟做错了什么?
解决方案
作为我评论的后续行动: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
}
}
}
推荐阅读
- mysql - SQL 事件 - 更新其他表后删除和更新表上的行
- vue.js - Vue:仅在以编程方式重定向到时才允许访问页面
- python - 均值方差优化 + Python + 调整约束
- c# - xamarin listview 获取所选项目
- c# - 在 CSHMTL 页面中使用 Razor 在 FOR 中嵌套 IF
- mysql - 查询帮助 - 如何获取所有在前 20 家商店购物过的顾客?
- ios - 检查用户是否已登录 iTunes Store
- python - 如何在 Docker 中运行的 Jupyter 笔记本中完成代码
- java - 如何在 JFrame 中正确实现 JButton?它只是占据了整个屏幕
- python - 如何将提取的特征传递给 keras 模型?