Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   XMLHTTPRequest дождаться выполнения всех асинхронных запросов (https://javascript.ru/forum/css-html/28267-xmlhttprequest-dozhdatsya-vypolneniya-vsekh-asinkhronnykh-zaprosov.html)

false 13.05.2012 14:27

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() повисает страница?

Что я делаю не так?

Раед 13.05.2012 14:50

Цитата:

Сообщение от false
почему если убрать alert() повисает страница?

Она развиснет, когда с станет равным 0

Kolyaj 13.05.2012 15:14

Цитата:

Сообщение от Раед
Она развиснет, когда с станет равным 0

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

Раед 13.05.2012 15:23

Цитата:

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

А, ну да.

false,
Делайте асинхронные запросы.

false 13.05.2012 15:25

Цитата:

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

Но ведь поидей функция обработчика событий
xmlhttp.onreadystatechange = function() {}
должна иметь доступ к этой переменной чтобы изменить её?

false 13.05.2012 15:27

Цитата:

Сообщение от Раед
Делайте асинхронные запросы.

как быть если мне требуется получить результаты всех запросов (т.е. нужно что-то вроде multi curl в php)?

Раед 13.05.2012 15:34

Цитата:

Сообщение от false (Сообщение 174198)
Но ведь поидей функция обработчика событий
xmlhttp.onreadystatechange = function() {}
должна иметь доступ к этой переменной чтобы изменить её?

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

false 13.05.2012 15:37

т.е. нереально написать что-то что будет дожидаться выполнения всех запросов :-(

Раед 13.05.2012 15:40

Цитата:

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

Попробуйте сделать только последний запрос синхронным

false 13.05.2012 15:47

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


Часовой пояс GMT +3, время: 00:20.