Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.05.2019, 10:33
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 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
Ответить с цитированием
  #2 (permalink)  
Старый 30.05.2019, 10:53
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от 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.
Ответить с цитированием
  #3 (permalink)  
Старый 30.05.2019, 11:19
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 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); }
            });
        });
    });
}


Здесь нет обработки ошибок, по заданию непонятно, что делать, если один из запросов обломается и зареджектится.
Ошибки не обрабатываются. Я вот не понял только, куда пихать функцию запроса?
Ответить с цитированием
  #4 (permalink)  
Старый 30.05.2019, 11:22
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от DarkPhoenix
Я вот не понял только, куда пихать функцию запроса?
она уже используется в willGetUrls, надо передать только массив с урлами
Ответить с цитированием
  #5 (permalink)  
Старый 30.05.2019, 11:30
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 11.05.2019
Сообщений: 30

Сообщение от Alexandroppolus Посмотреть сообщение
она уже используется в willGetUrls, надо передать только массив с урлами
А возможно подставить именно ту функцию с таймАут?
Ответить с цитированием
  #6 (permalink)  
Старый 30.05.2019, 11:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

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)
Ответить с цитированием
  #7 (permalink)  
Старый 30.05.2019, 11:48
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 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] делаем что?
Ответить с цитированием
  #8 (permalink)  
Старый 30.05.2019, 11:52
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от DarkPhoenix
if (!urls || !urls.length) { return Promise.resolve([]); } - Если есть значения и они не пусты, возвращаем массив?
Наоборот, сразу возвращаем пустой массив, если входных значений нет.
Сообщение от DarkPhoenix
urls.forEach(function(url, idx) {
request(url).then(function(v) {
res[idx] = v;
Этот момент не совсем понятен. Можно для чайников подробности?
Складываем очередной результат запроса в массив res, по тому индексу, по которому был соответствующий урл. Потом уменьшаем count. Если он обнулился, то все результаты получены, резолвим промис.
Ответить с цитированием
  #9 (permalink)  
Старый 30.05.2019, 15:30
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 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);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
protractor дождаться всех запросов через $http FireVolkhov Angular.js 4 16.04.2014 10:43