Promise.map с несколькими значениями

#javascript #promise #bluebird

#javascript #обещание #bluebird

Вопрос:

У меня есть следующий код:

 Promise.map(myValues, async myValue => {
  const owner = await findOwner(myValue);

  return sendMessage(owner);
})
  

И теперь я хочу понять, как я могу выполнить то же самое, если я хочу, чтобы на каждое значение отправлялось по два сообщения:

 Promise.map(myValues, async myValue => {
  const owner = await findOwner(myValue);
  /* I want both sendMessage and senMessageSpecific(owner) to happen but map expects just one return. How do I deal with this situation? */

  sendMessage(owner);

  sendMessageSpecific(owner);
})
  

Каков синтаксис, если внутри карты я хочу иметь возможность возвращать более одного обещания (в некоторых случаях)? Теперь это, очевидно, не работает, потому что я делаю возврат, поэтому он никогда не попадает во второе обещание.

Комментарии:

1. Я думаю, вам следует вернуть одно обещание, которое содержит 2 обещания?

2. Почему понижающий голос?

3. Я не уверен насчет голосования против, но ваш вопрос не очень ясен. Поскольку никакой код после возврата не будет доступен, намерение также неясно…

4. отредактировано для большей наглядности.

Ответ №1:

Я предполагаю, что ваши две функции сообщений возвращают обещания, и вы хотите, чтобы map ожидал обоих. В этом случае вы можете обернуть их в Promise.all . Вот так:

 Promise.map(myValues, async myValue => {
  const owner = await findOwner(myValue);
  return Promise.all([sendMessage(owner), sendMessageSpecific(owner)]);
})
  

В качестве альтернативы, если вас не волнуют возвращаемые значения, вы могли бы просто дождаться выполнения двух функций, как вы делаете с findOwner . Вот так:

 Promise.map(myValues, async myValue => {
  const owner = await findOwner(myValue);
  await sendMessage(owner);
  await sendMessageSpecific(owner);
})
  

В обоих случаях будут выполняться обе функции. Разница в том, что в первом случае они будут происходить параллельно, тогда как в последнем случае они будут происходить одно за другим.