Тема: HTA+VBS: Множественные асинхронные запросы WinHttpRequest
Помню, когда то давно эта тема поднималась. Но почему то тогда добиться нормальной асинхронности не удалось. Решил собрать примерчик с подобием Wrapper-а на событие WinHttpRequest. Ну и поделиться с Вами.
файл WinHttpEventWrapper.hta
<html>
<head>
<meta charset="Windows-1251">
</head>
<body>
<script language=vbscript>
Dim UrlArray, Url, WinHttpRequest, EventWrapper, StartTime
'Заполняем массив URL адресов
StartTime = Now
UrlArray = Array("http://www.ya.ru","http://www.google.ru","http://creep.ru","http://www.rambler.ru","http://creep.ru","http://yandex.ru","http://moskva.fm")
'Запускаем цикл перебора элементов массива
For Each Url in UrlArray
'Создаём новый объект WinHttpRequest
Set WinHttpRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
'Создаём Wrapper обработки его события
Set EventWrapper = New clsWinHttpEventWrapper
'Подключаем событие к нашей процедуре обработки
Set EventWrapper.onResponseFinished = GetRef("WinHttpRequest_OnResponseFinished")
'Делаем HTTP запрос
WinHttpRequest.Open "GET", Url, True
WinHttpRequest.Send()
'Запускаем обработчик события
EventWrapper.CatchEvent WinHttpRequest
Next
'Процедура события завершения запросов
Sub WinHttpRequest_OnResponseFinished(EventObject)
Dim Url, Status
On Error Resume Next
Url = EventObject.Option(1)
Status = EventObject.Status
On Error Goto 0
document.body.innerHtml = document.body.innerHtml & Url & " - " & Status & " - " & Second(Now-StartTime) & "с. <br>"
End Sub
'Класс Wrapper для асинхронной обработки запросов
Class clsWinHttpEventWrapper
Private timerID, whr, callback
'Метод для запуска отлова событий объекта
Sub CatchEvent(WinHttpRequest)
Set whr = WinHttpRequest
'Цепляем таймер к внешнему публичному свойству нашего класс модуля. Чтобы вызывать свойство onResponseFinished циклически
timerID = setInterval(Me,1)
End Sub
'Свойство которое опрашивается по таймеру. (Указание Default сделано для того чтобы сделать его доступным для передачи в setInterval)
Public Default Property Get onResponseFinished()
On Error Resume Next
'Проверяем состояние объекта
If whr.WaitForResponse(0) Then
On Error Goto 0
'Если callback установлен, то вызываем его и передаём параметром ссылку на наш объект
if isObject(callback) Then callback(whr)
'Останавливаем таймер
clearInterval timerID
End if
End Property
'Свойство для установки callback
Public Property Set onResponseFinished(ref)
Set callback = ref
End Property
End Class
</script>
</body>
</html>Результат работы скрипта у меня:
http://www.google.ru/ - 200 - 1с.
http://www.ya.ru/ - 200 - 1с.
http://creep.ru/ - 200 - 1с.
http://www.rambler.ru/ - 200 - 1с.
http://creep.ru/ - 200 - 1с.
http://www.yandex.ru/ - 200 - 1с.
http://www.moskva.fm/ - 200 - 2с.


