Использование Async/await для обработки URL
У меня есть следующая задача.
Задача 2 Написать функцию, принимающую список url путей и возвращающую промис, который резолвит результаты всех запросов по указанным url (важно: резолвит массив значений, резолвит не раньше последнего из запросов, не использовать Promise.all) P.S. список url - так как функция запроса фейковая, то под списком url стоить понимать любой массив строк.
ФУНКЦИЯ ЗАПРОСА:
function request(url) {
return new Promise((res, rej) => {
const delayTime = Math.floor(Math.random() * 10000) + 1;
setTimeout(() => res(url), delayTime);
});
}
Возникли две проблемы:
- первая если попробовать через Promise.all, тогда получаю undefined: undefined;
- вторая если писать через асинк/аваит, не могу сделать аналог new promise в котором будет ресолве -> forEach перебрать массив -> пушнуть в arr -> резолв.
Моя попытка.
const URL = [
'https://www.google.com.ua/',
'https://www.bing.com/',
'https://www.yahoo.com/'
];
const RESPONSE = [];
function request(URL) {
return new Promise((res, rej) => {
const delayTime = Math.floor(Math.random() * 10000) + 1;
setTimeout(() => res(URL), delayTime);
});
}
let requests = URL.map(URL => request(URL));
async function urlResponses() {
let requests = await URL.map(forEach(URL => request(URL)));
return RESPONSE.push(result)
}
// Promise.all(requests)
// .then(responses => responses.forEach(
// response => alert(`${response.url}: ${response.status}`)
// ));
Ответы (1 шт):
Автор решения: Sergei Kirjanov
→ Ссылка
const URL = [
'https://www.google.com.ua/',
'https://www.bing.com/',
'https://www.yahoo.com/'
];
function request(URL) {
return new Promise((res, rej) => {
const delayTime = Math.floor(Math.random() * 10000) + 1;
setTimeout(() => res(URL+" -- "+delayTime), delayTime);
});
}
async function urlResponses () {
const promises = URL.map(u => request(u))
const response = []
for(promise of promises) response.push(await promise)
return response
}
urlResponses().then(r=>console.log(r))