Promise.all没有返回资源映射Node.js

时间:2019-06-12 14:48:04

标签: node.js async-await outlook-restapi

我们正在与Outlook api集成,我们需要将恢复的电子邮件中的附件分组:

我们正在尝试这种方式:

const result = await client
    .api('/me/messages')
    .filter(searchMailFrom)
    .select('subject, from, receivedDateTime, sentDateTime, isRead, toRecipients, hasAttachments')
    .get()

  let dadosAnexo = result.value.map(async item => {
    if (item.hasAttachments) {
      const resultAtt = await client
        .api('/me/messages/' + item.id + '/attachments')
        .get()

      item.anexos = resultAtt.value
    }
  })

  await Promise.all(dadosAnexo)

  return res.status(200).send(result.value)

但是当我们放入Promise.all()时,系统只是不返回任何内容

1 个答案:

答案 0 :(得分:0)

您不会从.map函数内部返回任何内容。因此,dadosAnexo变成了Promise的数组,每个数组都解析为undefined

请查看MDN文档以获取有关.map的工作方式的更多详细信息:Map | MDN

然后,您将dadosAnexo传递给您的Promise.all通话。

  

但是当我们放入Promise.all()时,系统只是不返回任何内容

在这里,您的假设是错误的。

await Promise.all(dadosAnexo)

上面的await Promise.all调用实际上将返回undefined的数组。因为您正在传递它dadosAnexoPromise的数组,每个数组都解析为undefined)。另外,您没有将返回值分配给任何变量(因此,您实际上并不知道它是否在返回任何值)。

检查MDN文档以获取有关Promise.all工作方式的更多详细信息:Promise.all() | MDN

现在要解决您的问题,这是一个解决方案:

const result = await client
    .api('/me/messages')
    .filter(searchMailFrom)
    .select('subject, from, receivedDateTime, sentDateTime, isRead, toRecipients, hasAttachments')
    .get()

// promisesToAttach will be an array containing some Promises and some item values
const promisesToAttach = result.value.map(item => {
  if (item.hasAttachments) {
    // returning a promise
    return client
      .api('/me/messages/' + item.id + '/attachments')
      .get()
      .then(resultAtt => {
        item.anexos = resultAtt.value
        return item
      })       
  }
  // returning an item value
  return item
})

// resultWithAttachments will be an array of resolved item values
const resultWithAttachments = await Promise.all(promisesToAttach)

return res.status(200).send(resultWithAttachments)