在下面的代码中,我为每个异步函数使用了await Promise.all
,然后最终返回了一个值。因此,我想问一问:是否需要对每个异步函数都使用await Promise.all
还是做一个等待(放置在最后)await Promise.all
做这项工作?
async sendEmailNotifications() {
const users = await User.find({ })
const promises = users.map(async(user) => {
const _promises = user.appId.map(async(app) => {
const myApp = await App.findOne({ _id: app })
if (myApp) {
const sendNotification = await emailService.analyticsNotification(emailObj)
}
})
await Promise.all(_promises)
})
await Promise.all(promises)
return 'done'
}
答案 0 :(得分:3)
是的,两个Promise.all
对您当前的实现都是必需的。异步函数返回Promise。如果该函数内没有await
,并且该函数没有显式返回Promise,则Promise将立即解决。所以,没有
await Promise.all(_promises)
或
return Promise.all(_promises)
,您的const promises = users.map
数组将产生一个promise数组,所有promise都会立即解决。您需要内部Promise.all
才能使整个sendEmailNotifications
函数的Promise仅在所有.findOne
和analyticsNotification
完成后才能解决。
请记住,在您当前的代码中,所有请求都被立即发送出去;如果您担心的是,则没有迭代取决于最后一次迭代的Promise首先完成。唯一的代码阻止行为是
const myApp = await App.findOne({ _id: app })
if (myApp) {
const sendNotification = await emailService.analyticsNotification(emailObj)
}
.findOne
必须在运行analyticsNotification
之前解析,但是这种逻辑似乎是必需的,而且无法解决。
我想在技术上可能通过一次使每个{变为{em1} {1}}项目被转换为Promise并推送到外部数组,但这功能较少,导致代码更丑陋,IMO没有任何好处。