Возвращает промис, который резолвит результаты всех запросов
/*Написать функцию, принимающую список url
путей и возвращающую промис, который резолвит результаты всех запросов по указанным url (важно: резолвит массив значений, резолвит не раньше последнего из запросов) .*/ Так же есть сама функция запроса function request(url) { return new Promise((res, rej) => { const delayTime = Math.floor(Math.random() * 10000) + 1; setTimeout(() => res(url), delayTime); }); } Что я пытался сделать. function willGetUrls() { return new Promise((resolve, reject) => { var url = [ 'simon', 'david', 'chak', 'richard' ]; resolve(url); }); } Куда мне двигаться? Литературку бы. где разбор таких полётов. Или код... P.S. нельзя юзать promise.all |
Цитата:
function willGetUrls(urls) { if (!urls || !urls.length) { return Promise.resolve([]); } return new Promise(function(resolve, reject) { var count = urls.length; var res = []; urls.forEach(function(url, idx) { request(url).then(function(v) { res[idx] = v; if (--count < 1) { resolve(res); } }); }); }); } Здесь нет обработки ошибок, по заданию непонятно, что делать, если один из запросов обломается и зареджектится. |
Цитата:
|
Цитата:
|
Цитата:
|
DarkPhoenix,
:-? function request(url) { return new Promise((res, rej) => { const delayTime = Math.floor(Math.random() * 10000) + 1; setTimeout(() => res(url), delayTime); }); } function willGetUrls(urls) { if (!urls || !urls.length) { return Promise.resolve([]); } return new Promise(function(resolve, reject) { var count = urls.length; var res = []; urls.forEach(function(url, idx) { request(url).then(function(v) { res[idx] = v; if (--count < 1) { resolve(res); console.log(res)} }); }); }); } var urls = [ 'simon', 'david', 'chak', 'richard' ]; willGetUrls(urls) |
Цитата:
var count = urls.length; - счетчик тут понятно var res = []; - в res передаем все значения массива urls.forEach(function(url, idx) { request(url).then(function(v) { res[idx] = v; Этот момент не совсем понятен. Можно для чайников подробности? idx это индекс? Для каждого urls делаем request и в res[idx] делаем что? |
Цитата:
Цитата:
|
Цитата:
function request(url) { return new Promise((res,rej) => { const delayTime = Math.floor(Math.random() * 10000) + 1; setTimeout(() => (console.log(url), res(url)), delayTime); }); } function willGetUrls(urls) { return Promise.all(urls.map(request)); } var urls = ["simon", "david", "chak", "richard"]; willGetUrls(urls).then(console.log); Но и без статичного метода Promise.all тоже можно попробовать... function request(url) { return new Promise((res,rej) => { const delayTime = Math.floor(Math.random() * 10000) + 1; setTimeout(() => (console.log(url), res(url)), delayTime); }); } function willGetUrls(urls) { return new Promise(resolve => { urls.map(request).reduce(async (resultP, promise, index, promises) => { let { result = [], count = 0 } = await resultP; result[index] = await promise; if(promises.length === ++count) resolve(result); return { result, count }; }, {}); }); } var urls = ["simon", "david", "chak", "richard"]; willGetUrls(urls).then(console.log); |
Часовой пояс GMT +3, время: 14:34. |