Сконкатенировать результат 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 шт):
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();
Для объединения массивов можно применить метод .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>