我是否需要等待每个嵌套的诺言数组?

时间:2019-05-10 10:00:19

标签: javascript node.js asynchronous promise

在下面的代码中,我为每个异步函数使用了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'
}

1 个答案:

答案 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仅在所有.findOneanalyticsNotification完成后才能解决。

请记住,在您当前的代码中,所有请求都被立即发送出去;如果您担心的是,则没有迭代取决于最后一次迭代的Promise首先完成。唯一的代码阻止行为是

  const myApp = await App.findOne({ _id: app })
  if (myApp) {
    const sendNotification = await emailService.analyticsNotification(emailObj)
  }

.findOne必须在运行analyticsNotification之前解析,但是这种逻辑似乎是必需的,而且无法解决。

我想在技术上可能通过一次使每个{变为{em1} {1}}项目被转换为Promise并推送到外部数组,但这功能较少,导致代码更丑陋,IMO没有任何好处。