Вот метод использования Promise.all()
для сбора всех результатов, сглаживание массива массивов до одного массива:
const tags = req.query.tags;
let urls = [];
tags.split(",").forEach(tag => {
urls.push(`https://apicall.com/posts?tag=${tag}`);
});
Promise.all(urls.map(url => {
return axios.get(url).then(response => response.data.posts);
})).then(results => {
let singleArray = results.flat();
// de-dup this array here (left to the reader to finish)
res.json(finalResult);
}).catch(err => {
console.log(err);
});
Общая идея заключается в том, что вы используете urls.map()
, чтобы вернуть массив обещания.
Вы используете Promise.all()
для этого массива или обещания знать, когда они все выполнены, и получить окончательный массив результатов.
Затем используйте .flat()
, чтобы превратить массив массивы в один массив.
Затем они должны быть дедуплицированы. Я предполагаю, что это массив объектов, но я не знаю, какое свойство в этих объектах является ключом для дедупликации. Вам нужно будет показать нам, что есть у каждого пост-объекта и что определяет дублирование.
Вот пример того, как вы можете использовать объект Map
для дедупликации массива объектов. Предположим, что у каждого объекта есть свойство .id
, и это свойство вы хотите использовать для дедупликации, чтобы в конечном массиве результатов не было двух объектов с одинаковым id
.
let tracker = new Map();
for (const post of singleArray) {
tracker.set(post.id, post);
}
// get an array of posts from the Map object
let uniquePosts = Array.from(tracker.values());