Promise.all нет возврата res map nodejs - PullRequest
1 голос
/ 12 июня 2019

Мы интегрируемся с 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 голосов
/ 12 июня 2019

Вы ничего не возвращаете изнутри ваших .map функций.Таким образом, dadosAnexo становится массивом Promise с, каждый из которых будет преобразован в undefined.

Проверьте документы MDN для получения дополнительной информации о том, как .map работает: Карта |MDN .

Затем вы передаете dadosAnexo на ваш Promise.all вызов.

Но когда мы ставим Promise.all (), системапросто ничего не возвращает

Здесь ваше предположение неверно.

await Promise.all(dadosAnexo)

Вышеуказанный вызов await Promise.all фактически вернет массив undefined.Потому что вы передаете его dadosAnexo (массив Promise с, каждый из которых преобразуется в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...