 
			
				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,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от 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,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от DarkPhoenix
			
		
	 | 
 
	| 
		Я вот не понял только, куда пихать функцию запроса?
	 | 
 
	
 
 она уже используется в willGetUrls, надо передать только массив с урлами  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.05.2019, 11:30
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.05.2019 
					
					
					
						Сообщений: 30
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Alexandroppolus
			 
		
	 | 
 
	| 
		она уже используется в willGetUrls, надо передать только массив с урлами
	 | 
 
	
 
 А возможно подставить именно ту функцию с таймАут?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.05.2019, 11:36
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		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,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от 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);
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |