Я оставлю объяснение вплоть до других ответов, но просто хочу указать, что есть и разница в производительности.
Первое решение ждет на каждой итерации обещание, которое нужно выполнить.Вызывать checkLink
можно только в том случае, если предыдущий разрешен.Это последовательное решение.
check link1 => wait => check link2 => wait => check link3 => wait
Второе решение перебирает все элементы и отправляет запросы, не дожидаясь разрешения обещаний (по этой причине возвращается массив обещаний).Если вы дождетесь выполнения всех обещаний, то обнаружите, что это решение намного быстрее, поскольку запросы отправляются параллельно.
check link1 => check link2 => check link3 => wait for all
const sleep = async ms => new Promise(resolve => setTimeout(resolve, ms));
async function checkLink(link) {
await sleep(Math.random() * 1000 + 500); // sleep between 500 and 1500 ms
console.log(link);
return `status #${link}`;
}
(async function () {
const data = new Array(5).fill().map((_, index) => ({ app: "app", link: index }));
let objToSend;
console.log("solution #1");
objToSend = [];
for (let obj of data) {
objToSend.push({ app: obj.app, status: await checkLink(obj.link) });
}
console.log(objToSend);
console.log("==============================================");
console.log("solution #2");
objToSend = await Promise.all(data.map(async obj => {
return {
app: obj.app,
status: await checkLink(obj.link)
};
}));
console.log(objToSend);
})();
Во фрагменте первое решение занимает 500/1500 * 5 = 2500/7500
между 2500 и 7500 мс.Второе решение занимает от 500 до 1500 мс (в зависимости от самого медленного значения для разрешения).