Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.05.2012, 14:27
Новичок на форуме
Отправить личное сообщение для false Посмотреть профиль Найти все сообщения от false
 
Регистрация: 09.12.2011
Сообщений: 5

XMLHTTPRequest дождаться выполнения всех асинхронных запросов
Второй день бьюсь над проблемой:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>example</title>
 
<script type="text/javascript">
//Попытка синхронного вып. асинхронн. запр
function getXmlHttp(){
	try {
		return new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			return new ActiveXObject("Microsoft.XMLHTTP");
		} catch (ee) {
		}
	}
	if (typeof XMLHttpRequest!='undefined') {
		return new XMLHttpRequest();
	}
}

//выполнение списка url одновременно
function XmlHttpMulti(urls) {
var result=new Array(); //сюда будет записан результат
var c=parseInt(urls.length);
for(var i=0; i<urls.length; i++) {result[i]=undefined; get(urls[i], i);}

function get(url, n) {
var xmlhttp = getXmlHttp();
xmlhttp.open('GET', url, true);
xmlhttp.onreadystatechange = function() {
 if ( (xmlhttp.readyState==4) && (xmlhttp.status==200) ) {c--; result[n]=xmlhttp.responseText;}
}
xmlhttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
xmlhttp.send(null);}


//тут будет что-то тормаозящее скрипт пока не прогрузятся все url
while(c!=0) {alert('это как-бы пауза');}//почему если убрать alert() повисает страница?

return result;
}
 

var r=XmlHttpMulti(['http://webiteam.ru/test/multicurl/test.php?data=This+is+get+first','http://webiteam.ru/test/multicurl/test.php?data=This+is+get+second','http://webiteam.ru/test/multicurl/test.php?data=This+is+get+third']) ;

function test(i) {
document.getElementById('text').innerHTML = r[i];}

</script>
</head>
 
<body>
<a href="#" onClick="test(0)" >Show URL #1</a> <a href="#" onClick="test(1)" >Show URL #2</a> <a href="#" onClick="test(2)" >Show URL #3</a>
<div id="text">I am a Text</div>

</body>
</html>


Собственно проблема в этом:
//тут будет что-то тормаозящее скрипт пока не прогрузятся все url
while(c!=0) {alert('это как-бы пауза');}//почему если убрать alert() повисает страница?

Что я делаю не так?
Ответить с цитированием
  #2 (permalink)  
Старый 13.05.2012, 14:50
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от false
почему если убрать alert() повисает страница?
Она развиснет, когда с станет равным 0
Ответить с цитированием
  #3 (permalink)  
Старый 13.05.2012, 15:14
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Раед
Она развиснет, когда с станет равным 0
А c никогда не станет равным 0, потому что изменять c будет некому, браузер будет висеть в бесконечном цикле.
Ответить с цитированием
  #4 (permalink)  
Старый 13.05.2012, 15:23
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от Kolyaj
А c никогда не станет равным 0, потому что изменять c будет некому
А, ну да.

false,
Делайте асинхронные запросы.
Ответить с цитированием
  #5 (permalink)  
Старый 13.05.2012, 15:25
Новичок на форуме
Отправить личное сообщение для false Посмотреть профиль Найти все сообщения от false
 
Регистрация: 09.12.2011
Сообщений: 5

Сообщение от Kolyaj
А c никогда не станет равным 0, потому что изменять c будет некому
Но ведь поидей функция обработчика событий
xmlhttp.onreadystatechange = function() {}
должна иметь доступ к этой переменной чтобы изменить её?
Ответить с цитированием
  #6 (permalink)  
Старый 13.05.2012, 15:27
Новичок на форуме
Отправить личное сообщение для false Посмотреть профиль Найти все сообщения от false
 
Регистрация: 09.12.2011
Сообщений: 5

Сообщение от Раед
Делайте асинхронные запросы.
как быть если мне требуется получить результаты всех запросов (т.е. нужно что-то вроде multi curl в php)?
Ответить с цитированием
  #7 (permalink)  
Старый 13.05.2012, 15:34
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от false Посмотреть сообщение
Но ведь поидей функция обработчика событий
xmlhttp.onreadystatechange = function() {}
должна иметь доступ к этой переменной чтобы изменить её?
JS-интерпритатор однопоточный и не может ничего сделать, пока работает цикл. Вообще ничего, например
var a=true;
setInterval(function(){a=false},1000);
while(a){}//повесит браузер 
//и не надейтесь, что он развиснет через секунду

Последний раз редактировалось Раед, 13.05.2012 в 15:38.
Ответить с цитированием
  #8 (permalink)  
Старый 13.05.2012, 15:37
Новичок на форуме
Отправить личное сообщение для false Посмотреть профиль Найти все сообщения от false
 
Регистрация: 09.12.2011
Сообщений: 5

т.е. нереально написать что-то что будет дожидаться выполнения всех запросов :-(
Ответить с цитированием
  #9 (permalink)  
Старый 13.05.2012, 15:40
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от false
т.е. нереально написать что-то что будет дожидаться выполнения всех запросов :-(
Попробуйте сделать только последний запрос синхронным

Последний раз редактировалось Раед, 13.05.2012 в 15:57.
Ответить с цитированием
  #10 (permalink)  
Старый 13.05.2012, 15:47
Новичок на форуме
Отправить личное сообщение для false Посмотреть профиль Найти все сообщения от false
 
Регистрация: 09.12.2011
Сообщений: 5

даже если и сделать последний асинхронным остальные-то останутся синхрнными и на общее время загрузки это мало повлияет.
Похоже придется переписывать свой код под асинхронное выполнение.
Спасибо всем что объяснили мои ошибки.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить скрипт дождаться выполнения асинхронной операции? SindBad Events/DOM/Window 5 22.04.2012 23:56
Перенаправление всех запросов на одну страницу trikadin Серверные языки и технологии 13 29.12.2011 02:40
backboneJS, дождаться выполнения всех AJAX запросов. anty Библиотеки/Тулкиты/Фреймворки 1 28.12.2011 04:30
Как дождаться выполнения эффекта hide и потом удалить элемент? FRIE jQuery 3 07.06.2011 11:58
Как дождаться полного выполнения функции? San4ezy Events/DOM/Window 13 15.11.2009 19:41