Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.02.2010, 04:16
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Параллельные запросы AJAX
Хочу сделать два параллельных соединения, одно устанавливается с начала загрузки страницы и дальше висит некоторое время (sleep на серверном обработчике), второе соединение устанавливается при нажатии на кнопку, отправляет данные пользователя на сервер, получает ответ и сразу закрывается.
Проблема в том, что в IE и Opera данные не приходят (точнее readystate!=4), пока не отработает первый запрос, т.е. создаётся некая очередь.

При втором пользовательском запросе, IE выставляет ему readystate=1, Opera readystate=2 и пока не закроется первое соединение, 4 не присваивается, а FF делает всё правильно - сразу выдаёт 1,2,3,4, пришедшие данные и не ждёт окончания первого запроса.

Если нужно, код могу привести (библиотеки не использую). Толи ошибка в коде, толи сам механизм так работает, в каждом браузере по своему.
Ответить с цитированием
  #2 (permalink)  
Старый 26.02.2010, 09:24
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

http://webo.in/articles/habrahabr/39...ctions-limits/
Ответить с цитированием
  #3 (permalink)  
Старый 26.02.2010, 09:40
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

т.е. в данном случае третье соединение - это обычный http запрос открытия страницы и надо его каким-то образом отключить? Два других соединения - это два XHR-объекта.
Ответить с цитированием
  #4 (permalink)  
Старый 26.02.2010, 09:41
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Ну я же не знаю, какие у вас там соединения открываются.
Ответить с цитированием
  #5 (permalink)  
Старый 26.02.2010, 09:57
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Первое соединение - обычная загрузка самой страницы и после загрузки (статус 200) оно по идее должно закрыться. Второе соединение - на window.onload создаётся первый XHR и посылается запрос на сервер. Страница уже загружена, всё нормально работает. Теперь по нажатии на кнопку создаётся второй XHR. Получается 2 активных ajax-соединения, вроде ничего не нарушаем. Но оно становится в очередь и данные с сервера не приходят, пока не отработает первый XHR.
Ответить с цитированием
  #6 (permalink)  
Старый 26.02.2010, 10:08
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 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>

Количество соединений:
Изображения:
Тип файла: jpg str.jpg (16.0 Кб, 17 просмотров)
Ответить с цитированием
  #7 (permalink)  
Старый 26.02.2010, 15:03
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Фото как-то мелко загрузилось, добавлю ссылку на радикал - http://s49.radikal.ru/i126/1002/c5/3a1aca1ed297.png.
Два post запроса - это и есть два XHR, сделал принтскрин во время выполнения, звёздочки указывают, что данные на сервер ушли, но ответа пока не было. В stream.aspx находится sleep (одна минута), а update.aspx должен вернуть данные сразу же, там только одна единственная строчка с выводом данных. Но он не выполняется, пока не выполнится и закроется stream.aspx.
С этим и проблема, вроде и соединений два, а они выстраиваются в очередь, вместо того, чтобы выполняться параллельно. Не думаю, что высказывания про два соединения миф, видимо ошибка где-то в коде. Пока это работает только в FF-3.
Ответить с цитированием
  #8 (permalink)  
Старый 27.02.2010, 16:37
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

А get-запросы если послать?

С двумя фреймами будет всё ок.
Ответить с цитированием
  #9 (permalink)  
Старый 28.02.2010, 09:32
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 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-соединение впихнуть, проблемы не вижу. Но для общего образования хотелось бы узнать, возможно ли несколько параллельных соединений или нет.
Ответить с цитированием
  #10 (permalink)  
Старый 02.03.2010, 03:12
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Ладно, с одним доменом видимо никак (точнее только с тем доменом, с которого загрузился сайт, что весьма странно). Между разными доменами грузится параллельно, а на один сайтовский - последовательно (за исключением FF). Кстати, на другом домене начинает работать принцип двух соединений в IE.

Последний раз редактировалось DMH, 02.03.2010 в 10:08.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в ajax запросе передать файл методом POST mcpro jQuery 1 16.12.2009 11:41
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23
Проблема с AJAX запросом + mod_rewrite BrokenEye AJAX и COMET 1 12.07.2009 02:08
Объясните как вызывается ajax скрипт AddressBook из формы prog90 AJAX и COMET 3 06.06.2009 16:12
ajax запрос с подгружемным js HelpeR AJAX и COMET 1 27.10.2008 12:44