Показать сообщение отдельно
  #1 (permalink)  
Старый 09.10.2016, 12:37
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Идентификация запросов в обработчике XMLHttpRequest
Стоит задача получить со страницы url(несколько), перейти по ним, распарсить, проверить, отправить форму и снова проверить ответ.

Так вот, делаю так:
var xhr		// Глобальный идентификатор XMLHttpRequest
var xhrId	// Глобальный идентификатор запроса

function GetHttpRequest(href, id) // Формирование запроса(url запроса, id запроса)
{
	xhr = new XMLHttpRequest()
	xhr.withCredentials = true
	xhr.onreadystatechange = ProcessRequestChange
	xhr.open('GET', href, true)
	xhr.send(null)
	xhrId = id // Записать id в глобальную переменную
}
function ProcessRequestChange()		// Общий обработчик
{
	if(xhr.readyState != 4) return	// Если запрос не выполнен - игнор
	if(xhr.status == 200)			// Всё хорошо, запрос отправлен, ответ пришел
	{
		html = xhr.responseText // Получить текст ответа
		
		switch(xhrId)
		{
			case 999: // Получить район(первый запрос)
			{
				var a
				if((a = html.indexOf('Район: ')) != -1)
				{
					var s = html.indexOf('<b><a href=\'', a) + 12
					var e = html.indexOf('\'>', s)
					var str = html.substring(s, e).replace('amp;', '')
					GetHttpRequest('http://www.site.ru/' + str + '&st=sh', 998) // Получить все объекты в производстве
				}
				break
			}
			case 998: // Получить все предприятия в производстве(второй запрос)
			{
				var s = 0, id = 0

				while((s = html.indexOf('info.php?id=', s)) != -1) // Получить все ссылки
				{
					var e = html.indexOf('\'>', s)
					var str = html.substring(s, e)
					s = e

					if(str.length > 23) continue // Когда на объект можно устроиться ссылки дублируются...

					GetHttpRequest('http://www.site.ru/' + str, 100 + id++) // Запрос на предприятие производства
				}
				break
			}
			case 100: // Обработка предприятий производства, искать формы отправки
			{
				// И вот тут я впёрся, запросы - то приходят не сразу + вразнобой, а id запроса меняется
				break
			}
			case 0: break // Без обработки
		}
	}
}
chrome.runtime.onMessage.addListener // Сообщение из другого скрипта(по нажатию кнопки)
(
	function(request, sender, sendResponse)
	{
		GetHttpRequest('http://www.site.ru/map.php', 999) // Получить район(первый запрос)
	}
)


Получаю значит последовательно:страницу(и з неё дергаю адрес), потом получаю несколько ссылок, и делаю запросы в цикле.

И вот тут у меня всё пошло не по плану, запросы приходят не сразу + вразнобой, а id запроса перезаписывается.

В итоге: код в обработчике сможет выполниться только для последнего запроса...

Может есть варианты по другому как - то ид передавать?

+Не подскажите как свитчить диапазон чисел?
В JS оно как - то по другому делается чем во всех других языках(понятно, код - то не компилируется).

В общем как мне это сделать?
case: 100..120:


Так?
switch(xhrId)
{
	case 999: break
	case 998: break
	case xhrId > 99 && xhrId < 121: break
}

Последний раз редактировалось Артист, 09.10.2016 в 12:44.
Ответить с цитированием