Сконкатенировать результат Promise.all?

Всем привет.

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


const getQuriesResult = async () => {
   const resultArray = [];
   
   Promise.all([
      await axios.get('https://jsonplaceholder.typicode.com/todos/'),
      await axios.get('https://jsonplaceholder.typicode.com/users/')
   ]).then( results => {

      results.map( ( item, i, arr ) => {
         
         // тут нужна конкатенация всех массивов из всех запросов в один...
         
         console.log(arr[i].data);
         // resultArray.concat(arr[i].data);
      } )
   });
};

getQuriesResult();

Песочница

Буду очень благодарен за решение.


Ответы (2 шт):

Автор решения: Alexander Chernykh
const getQuriesResult = async () => {
   const res = await Promise.all([
      await axios.get('https://jsonplaceholder.typicode.com/todos/'),
      await axios.get('https://jsonplaceholder.typicode.com/users/')
   ]);
   let results = [];
   res.forEach((obj) => {
      results = [...results, ...obj.data];
      }
   );
   return results
};

getQuriesResult();
→ Ссылка
Автор решения: Grundy

Для объединения массивов можно применить метод .concat. Данный метод может принимать несколько массивов для объединения.

Таким образом код объединения может выглядеть так:

.then( results => {
    resultArray = resultArray.concat(...results);
})

Так как .concat возвращает новый массив, результат выполнения нужно сохранять.

Также стоит обратить внимание, на не совсем верное использование await в коде в вопросе.

Promise.all([
  await axios.get('https://jsonplaceholder.typicode.com/todos/'),
  await axios.get('https://jsonplaceholder.typicode.com/users/')
])

Данная запись не имеет особого смысла, так как Promise.all используется для ожидания всех Promise, однако в данном случае, ему в параметры передаются сами значения, а не Promise.

Таким образом код можно заменить следующим:

const results = await Promise.all([
  axios.get('https://jsonplaceholder.typicode.com/todos/'),
  axios.get('https://jsonplaceholder.typicode.com/users/')
]);

Далее уже работать с переменной results.

Если перед объединением результатов необходимо их предварительно обработать, например получить определенное свойство, можно воспользоваться методом .map

Итоговый код может стать таким:

(async() => {
  const getQuriesResult = async() => {
    const resultArray = [];

    const results = await Promise.all([
      axios.get('https://jsonplaceholder.typicode.com/todos/'),
      axios.get('https://jsonplaceholder.typicode.com/users/')
    ]);

    return resultArray.concat(...results.map(item => item.data));
  };

  console.log(
    await getQuriesResult()
  );
})();
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

→ Ссылка