Как дождаться отправки нескольких ответов выборки в массив, прежде чем отправлять данные обратно клиенту в (Node Express JS)

#javascript #node.js #express #async-await #fetch

Вопрос:

Я получаю имена нескольких животных в запросе, разделенные запятыми. Теперь мне нужно вызвать API, который принимает только одно имя животного за раз. Я хочу вызвать один и тот же API один раз для каждого животного и поместить jsonified данные в массив, прежде чем отвечать своему клиенту.

Я получаю пустой массив на своем клиенте во время тестирования, и, насколько я понимаю, это происходит потому, что res.send() выполняется, пока обещание ожидает разрешения.

Приветствуется любое решение.

 router.get('/animals', async (req, res) => {
  const mammalsArray = req.query.mammals.split(',');
  let final = [];
  await mammalsArray.forEach(async function(mammal) {
        const response = await fetch(`https://someapi.com/pedia?tag=${mammal}`);
        const json = await response.json();
        final.push(json);
      });
  res.send(final);
});
 

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

1. forEach ничего не возвращает.

Ответ №1:

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

Вы можете дождаться всех обещаний с Promise.all помощью .

Я использовал map вместо forEach того, чтобы сопоставлять все значения массива с promises.

 router.get('/animals', async(req, res) => {
  const mammalsArray = req.query.mammals.split(',');
  let final = [];
  let promisesArray = mammalsArray.map(async function(mammal) {
    const response = await fetch(`https://someapi.com/pedia?tag=${mammal}`);
    const json = await response.json();
    final.push(json);
  });
  await Promise.all(promisesArray);
  res.send(final);
}); 

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

1. Спасибо за решение. Это помогло мне.