30.05.2019, 10:33
|
Аспирант
|
|
Регистрация: 11.05.2019
Сообщений: 30
|
|
Возвращает промис, который резолвит результаты всех запросов
/*Написать функцию, принимающую список 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
|
|
30.05.2019, 10:53
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от DarkPhoenix
|
P.S. нельзя юзать promise.all
|
ну понятно. Тебе надо по факту написать свой 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); }
});
});
});
}
Здесь нет обработки ошибок, по заданию непонятно, что делать, если один из запросов обломается и зареджектится.
Последний раз редактировалось Alexandroppolus, 30.05.2019 в 10:56.
|
|
30.05.2019, 11:19
|
Аспирант
|
|
Регистрация: 11.05.2019
Сообщений: 30
|
|
Сообщение от Alexandroppolus
|
ну понятно. Тебе надо по факту написать свой 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); }
});
});
});
}
Здесь нет обработки ошибок, по заданию непонятно, что делать, если один из запросов обломается и зареджектится.
|
Ошибки не обрабатываются. Я вот не понял только, куда пихать функцию запроса?
|
|
30.05.2019, 11:22
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от DarkPhoenix
|
Я вот не понял только, куда пихать функцию запроса?
|
она уже используется в willGetUrls, надо передать только массив с урлами
|
|
30.05.2019, 11:30
|
Аспирант
|
|
Регистрация: 11.05.2019
Сообщений: 30
|
|
Сообщение от Alexandroppolus
|
она уже используется в willGetUrls, надо передать только массив с урлами
|
А возможно подставить именно ту функцию с таймАут?
|
|
30.05.2019, 11:36
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
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)
|
|
30.05.2019, 11:48
|
Аспирант
|
|
Регистрация: 11.05.2019
Сообщений: 30
|
|
Сообщение от рони
|
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)
|
if (!urls || !urls.length) { return Promise.resolve([]); } - Если есть значения и они не пусты, возвращаем массив?
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] делаем что?
|
|
30.05.2019, 11:52
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от DarkPhoenix
|
if (!urls || !urls.length) { return Promise.resolve([]); } - Если есть значения и они не пусты, возвращаем массив?
|
Наоборот, сразу возвращаем пустой массив, если входных значений нет.
Сообщение от DarkPhoenix
|
urls.forEach(function(url, idx) {
request(url).then(function(v) {
res[idx] = v;
Этот момент не совсем понятен. Можно для чайников подробности?
|
Складываем очередной результат запроса в массив res, по тому индексу, по которому был соответствующий урл. Потом уменьшаем count. Если он обнулился, то все результаты получены, резолвим промис.
|
|
30.05.2019, 15:30
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от DarkPhoenix
|
P.S. нельзя юзать 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 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);
|
|
|
|