Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   createRequestObject в цикле (https://javascript.ru/forum/dom-window/25601-createrequestobject-v-cikle.html)

KingStar 10.02.2012 02:40

createRequestObject в цикле
 
Вем привет. Задача отправить запрос и получить ответ в цикле, цикл может быть разным, вот код:

for (i=0; i<5; i++) {
		
		var id = 'id_'+i;		
		var id_send = document.getElementById(id).value;
		var id_result = 'result_'+i;
		
		var http = createRequestObject();		
						
		if( http ) {
				
			http.open('get', 'name.php?send_id='+id_send);
		
			http.onreadystatechange = function () {							
				if(http.readyState == 4) {				
					document.getElementById(id_result).innerHTML=http.responseText;						
					return;
				}
			}
				
				http.send(null);				
		} else {
				document.location = 'index.php';
		}

}


результат вставляется в id='id_result' в таблицу, но проблема в том, что результат получает только последний, и заполняется результат в таблице только последняя строка :(

Где грабли???

KingStar 10.02.2012 20:06

Никто не знает???

zebra 10.02.2012 21:11

Оберните всё что в цикле в функцию

KingStar 10.02.2012 22:27

Нифига чет не получается, ошибки разные бъет, может напишите куда и как??

Вот весь код:


echo "<script language='javascript'>
	
	var num = ".$rows.";
	
	for (i=0; i<num; i++) {
		
		id = 'distribution_id_'+i;		
		distribution_id = document.getElementById(id).value;
		id_result = 'result_send_'+i;
	
	 	http = createRequestObject();					
						
		http.function(){	
					
		if(http.readyState == 4) {	
			if(http.status == 200) {	
				document.getElementById(id_result).innerHTML=http.responseText;	
			}
		}
					
		http.open('get', 'func.php?send_distribution='+distribution_id, true);														
		http.send(null);				
    }
  
}

</script>";

Nekromancer 10.02.2012 22:30

http://javascript.ru/basic/closure

KingStar 11.02.2012 05:31

Я уже всю голову сломал :( Уже все перепробовал что только можно

Методом alert(i); выяснил, что до строки http.onreadystatechange i выдает согласно циклу, а уже внутри http.onreadystatechange выдает номер последнего цикла

window.onload = function(){

	for (i=0; i<4; i++) {
		
		id = "distribution_id_"+i;		
		distribution_id = document.getElementById(id).value;
		id_result = "result_send_"+i;


                var http = createRequestObject();				
			
		if( http ) {
				
				http.open("get", "func.php?send_distribution="+distribution_id, true);
	

/* ЗДЕСЬ alert(i) выдает номер согласно циклу от 0 до 4  */

			
				http.onreadystatechange = function () {

/* ЗДЕСЬ alert(i) выдает номер 4  */
						
					if(http.readyState == 4) {					
						document.getElementById(id_result).innerHTML=http.responseText;	
						return;	
					}
				}



		
				http.send(null);
		} else {
			document.location = "index.php";
		} 



	}
}


:help: :help: :help: :help: :help: :help: :help:

devote 11.02.2012 06:18

Цитата:

Сообщение от KingStar
Методом alert(i); выяснил, что до строки http.onreadystatechange i выдает согласно циклу, а уже внутри http.onreadystatechange выдает номер последнего цикла

А чему вы удивляетесь делая асинхронные запросы... хотите что бы цикл ждал... делайте синхронные запросы:

http.open("get", "func.php?send_distribution="+distribution_id, false);

Nekromancer 11.02.2012 11:37

Цитата:

Сообщение от devote
делайте синхронные запросы:

Нельзя советовать такое!

devote 11.02.2012 11:52

Цитата:

Сообщение от Nekromancer
Нельзя советовать такое!

ну а что ему еще посоветовать? есть два пути, либо сделать просто синхронно, либо все переделать иначе и по другому принципу. Но то что синхронно конечно не хорошо.

Nekromancer 11.02.2012 11:57

devote,
Значит надо переделать, пусть пойдёт читать как.


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