for (var i = 0; i < 5; ++i) {
var xhr;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
xhr.open('GET', '/Test/LongOperation?p=' + new Date());
xhr.send('');
}
Это только демонстрационный код (не живой код), но он иллюстрирует основную проблему. LongOperation
- метод, который возвращает результат через 10 секунд.IE8 зависает, когда одновременно запускается более 4 асинхронных XmlHttpRequests
Вопросы:
Почему IE8 (и, возможно, другие ИЭ) вешают, когда пользователь пытается перейти от страницы справа после того, как выше фрагмент кода был выполнен? FireFox/Safari отменяет эти запросы и позволяет перейти на другую страницу. Если вы замените
'i < 5'
на'i < 4'
, тогда IE не будет висеть.Как обойти это уродливое поведение IE? Пользователи очень расстраиваются, когда их браузер внезапно зависает.
предел AFAIK является 2, если они не изменили поведение по умолчанию в IE 8. Я сомневаюсь, что, потому что я довольно уверен, что RFC указывает, что «2 одновременных подключения к одному серверу». –
Лучший способ понять, если это проблема, найдите связанный реестр, измените номер параллельного соединения и повторите попытку, посмотрите, все ли он зависает. –
Спасибо за помощь. Что касается реестра, я знаю об этой «функции», но я не могу заставить пользователей изменять необходимые настройки в реестре на своей машине. О пределе, FireFox также имеет схожие ограничения, но он не зависает. Ограничение означает, что при достижении (пределе) дальнейшие запросы не отправляются на сервер до тех пор, пока не будет завершен какой-либо ожидающий запрос запрос, но они будут стоять в очереди и будут выполняться. Проблема с IE: если IE имеет такие _queued_ запросы, браузер зависает при навигации в сторону от страницы. – Roman