
26.02.2010, 04:16
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Параллельные запросы AJAX
Хочу сделать два параллельных соединения, одно устанавливается с начала загрузки страницы и дальше висит некоторое время (sleep на серверном обработчике), второе соединение устанавливается при нажатии на кнопку, отправляет данные пользователя на сервер, получает ответ и сразу закрывается.
Проблема в том, что в IE и Opera данные не приходят (точнее readystate!=4), пока не отработает первый запрос, т.е. создаётся некая очередь.
При втором пользовательском запросе, IE выставляет ему readystate=1, Opera readystate=2 и пока не закроется первое соединение, 4 не присваивается, а FF делает всё правильно - сразу выдаёт 1,2,3,4, пришедшие данные и не ждёт окончания первого запроса.
Если нужно, код могу привести (библиотеки не использую). Толи ошибка в коде, толи сам механизм так работает, в каждом браузере по своему.
|
|

26.02.2010, 09:24
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
|
|

26.02.2010, 09:40
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
т.е. в данном случае третье соединение - это обычный http запрос открытия страницы и надо его каким-то образом отключить? Два других соединения - это два XHR-объекта.
|
|

26.02.2010, 09:41
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Ну я же не знаю, какие у вас там соединения открываются.
|
|

26.02.2010, 09:57
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Первое соединение - обычная загрузка самой страницы и после загрузки (статус 200) оно по идее должно закрыться. Второе соединение - на window.onload создаётся первый XHR и посылается запрос на сервер. Страница уже загружена, всё нормально работает. Теперь по нажатии на кнопку создаётся второй XHR. Получается 2 активных ajax-соединения, вроде ничего не нарушаем. Но оно становится в очередь и данные с сервера не приходят, пока не отработает первый XHR.
|
|

26.02.2010, 10:08
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Приведу код на всякий случай:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<title></title>
<script>
// AJAX streaming start
function sendstream() {
req_s=new XMLHttpRequest();
req_s.open("POST","streaming.aspx",true);
req_s.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req_s.onreadystatechange = function() {
// alert('stream = '+req_s.readyState+'; ');
if (req_s.readyState == 4 && req_s.status == 200) resultstream(req_s.responseText);
}
req_s.send("stream");
}
// AJAX streaming end
// AJAX update start
function senduserdata() {
req_u=new XMLHttpRequest();
req_u.open("POST","update.aspx",true);
req_u.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req_u.onreadystatechange = function() {
// alert('update = '+req_u.readyState+'; ');
if (req_u.readyState == 4 && req_u.status == 200) resultuserdata(req_u.responseText);
}
req_u.send("userdata");
}
// AJAX update end
function resultstream(s) {
alert(s+"; С потока пришли новые данные");
}
function resultuserdata(u) {
alert(u+"; Данные пользователя изменены");
}
window.onload=function() { sendstream(); }
</script>
</head>
<body>
<input id="upd" type="text" style="width:100px">
<input type="button" value="Отправить" onclick="senduserdata()">
</body>
</html>
Количество соединений:
|
|

26.02.2010, 15:03
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Фото как-то мелко загрузилось, добавлю ссылку на радикал - http://s49.radikal.ru/i126/1002/c5/3a1aca1ed297.png.
Два post запроса - это и есть два XHR, сделал принтскрин во время выполнения, звёздочки указывают, что данные на сервер ушли, но ответа пока не было. В stream.aspx находится sleep (одна минута), а update.aspx должен вернуть данные сразу же, там только одна единственная строчка с выводом данных. Но он не выполняется, пока не выполнится и закроется stream.aspx.
С этим и проблема, вроде и соединений два, а они выстраиваются в очередь, вместо того, чтобы выполняться параллельно. Не думаю, что высказывания про два соединения миф, видимо ошибка где-то в коде. Пока это работает только в FF-3.
|
|

27.02.2010, 16:37
|
 |
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
А get-запросы если послать?
С двумя фреймами будет всё ок.
|
|

28.02.2010, 09:32
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
И с GET и с iframe и со <script>, всё выстраивается в очередь. В FF же во всех этих случаях потоки параллельны.
function sendjs() {
var scriptElem = document.createElement( 'script' );
scriptElem.setAttribute( 'src' , 'streaming.aspx' );
scriptElem.setAttribute( 'type' , 'text/javascript' );
document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );
}
// Два iframe. Данные приходят, когда отработают оба. В FF данные приходят независимо.
function sendiframe() {
var scriptifr = document.createElement( 'iframe' );
scriptifr.setAttribute( 'src' , 'streaming.aspx' );
document.getElementsByTagName( 'body' )[0].appendChild( scriptifr );
var ifr = document.createElement( 'iframe' );
ifr.setAttribute( 'src' , 'update.aspx' );
document.getElementsByTagName( 'body' )[0].appendChild( ifr );
}
В моём случае можно впринципе всё в одно ajax-соединение впихнуть, проблемы не вижу. Но для общего образования хотелось бы узнать, возможно ли несколько параллельных соединений или нет.
|
|

02.03.2010, 03:12
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Ладно, с одним доменом видимо никак (точнее только с тем доменом, с которого загрузился сайт, что весьма странно). Между разными доменами грузится параллельно, а на один сайтовский - последовательно (за исключением FF). Кстати, на другом домене начинает работать принцип двух соединений в IE.
Последний раз редактировалось DMH, 02.03.2010 в 10:08.
|
|
|
|