@Scorpiored88

Как правильно отправлять HTTP запросы в цикле?

Всем доброго!
Столкнулся с проблемой отправки более 200 запросов к ресурсам которые не всегда доступны.
Сейчас попробую подробние:
Есть у меня пул из 200+ ip адресов 192.168.1.1 - 192.168.1.254, среди которых, приблизительно только 3 ip валидны, но я не знаю какие именно, и каждый раз это могут быть разные ip.
Тоесть, 1-3 машины с неизвесными IP (известно только пул) на которых запущо http сервер и слушает запросы.
И вот когда я запускаю цикл с 200+ запросами fetch они доходят по назначению как когда, 50 на 50. В даном случаи мне ненужен ответ от серверов, мне нужно только 100% отправить запрос, но в связи с тем, что большая часть адресов не валидна, там нет никакого http сервера, или другого девайса вовсе, у меня сыпятся ошибки, через которые запросы могут не доходить к нужным адресам. Вот код:
servers.forEach(server=>{
         fetch(`http://${server}:3347/off`, {method: 'POST'})
  })


или:

function fetchWrapper(server) {
  return fetch(`http://${server}:3347/off`, {method: 'POST'}).then(response => {
    return response.json().then(json => {
      return response.ok ? json : Promise.reject(json);
    });
  });
}


servers.forEach(server=>{
         fetchWrapper(server).then(console.log.bind(console));
  })


Иногда все проходит успешно, а иногда запрос не проходит, а иногда нужно слишком долго ждать(тогда даже в друхиг вкладках ничего не грузится)

Есть у мени я другая часть написаная на Angular 1, но там мне уже нужен ответ:

.factory('extRequest',($http)=>{
		return {
			getList : (ip)=> {
				return $http.get(`http://${ip}:3347/identify`,{timeout: 2000}).
					then(answ=>{
					return answ['data']
				})
				
			} 
             })


angular.forEach(ips,(ip)=> {
	extRequest.getList(ip).then(term =>{
			$scope.list.push(term);
	})


В Angular наверное нужно использовать очереди $q но каких-то подходящих примеров я как-то не нашел или не понял.
  • Вопрос задан
  • 1488 просмотров
Пригласить эксперта
Ответы на вопрос 1
artmadiar
@artmadiar
Node.js developer
Посоветовал бы такую конструкцию:
// выполнить все запросы разом
Promise.all(servers.map(server=>fetchWrapper(server)))
// дождаться выполнения всех
.then((results) => {
...
})
// минус в том, что если хоть один руганется, то слетит всё. Но как я понял, 404 или 500 это не ошибка
.catch(err => console.error(err))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы