ajax множественные запросы через XMLHttpRequest

savage
На сайте с 10.01.2007
Offline
224
1874

Начал изучать ajax. Необходимо реализовать такую задачу - первый XMLHttpRequest объект читает данные из файла со строками. Полученные данные разбиваются в массив по разделителю (<br>). Это нормально получается. Дальше нужно элементы получившегося массива последовательно скормить через ajax другому php скрипту для обработки. Тогда встает проблема использования XMLHttpRequest во второй, третий... и т.д. разы просто с другими параметрами. Почему-то обрабатывается только последний элемент массива, видимо это связано с тем xhr1.readyState еще не равно 4, а уже происходит очередной вызов. Как реализуется такие множественные запросы через один XMLHttpRequest?

Вот, собственно, код:

<script language="JavaScript" type="text/javascript">

var xhr, xhr1, alls;
alls="";
if (document.XMLHttpRequest)
{
xhr=new XMLHttpRequest();
xhr1=new XMLHttpRequest();
}
else
{
xhr=new ActiveXObject("Microsoft.XMLHTTP");
xhr1=new ActiveXObject("Microsoft.XMLHTTP");
}

function callserver(mystri)
{
xhr1.open('GET','test.php?is_buy=on&str='+mystri, true);
xhr1.send('');
xhr1.onreadystatechange=function ()
{
if (xhr1.readyState==4)
{

if (xhr1.status == 200)
{
alls=alls.concat(xhr1.responseText);
document.getElementById('contx').innerHTML=alls;
}
}
}
}


xhr.open('GET','readfile.php', true);
xhr.onreadystatechange=function ()
{
if (xhr.readyState==4)
{
if (xhr.status == 200)
{
var mall=xhr.responseText;
var mystr=new Array();
var splitExp=/<br>/;
var mystr=mall.split(splitExp);
i=0;
callserver(mystr);
for(i=1;i<mystr.length;i++)
{
alert(mystr);
callserver(mystr);
}

}
}
}

xhr.send('');
</script>
Купить / продать сайт ( https://www.telderi.ru/?pid=ca1f70 ) | Недорогой и надежный хостинг ( https://www.get-host.ru )
[Удален]
#1

а зачем через один вообще?) создавать каждый раз новый объект и все

savage
На сайте с 10.01.2007
Offline
224
#2
bearman:
а зачем через один вообще?) создавать каждый раз новый объект и все

т.е. не дожидаться пока предыдущий отработает? где-то я читал, что вроде есть ограничение на количество одновременно открытых соединений с сервером, вроде даже всего 2 возможно. В идеале задача такая - запрос прошел, отработал, вывели результат, сделали следующий запрос, отработал, вывели результат и т.д.

[Удален]
#3
savage:
т.е. не дожидаться пока предыдущий отработает? где-то я читал, что вроде есть ограничение на количество одновременно открытых соединений с сервером, вроде даже всего 2 возможно.

почему не дожидаясь то сразу :)

дожидаясь конечно

savage
На сайте с 10.01.2007
Offline
224
#4
bearman:
почему не дожидаясь то сразу :)

дожидаясь конечно

Так а новый объект и запрос где создавать? В xhr1.onreadystatechange что ли? Потом следующий тоже надо будет дождаться - типа рекурсии что-то получается.

[Удален]
#5

savage, ну да, можно там :)

нет, рекурсия не получится, запросы то асинхронные

savage
На сайте с 10.01.2007
Offline
224
#6
bearman:
savage, ну да, можно там :)

нет, рекурсия не получится, запросы то асинхронные

Старые объекты при этом нужно как-то закрывать, уничтожать?

[Удален]
#7
savage:
Старые объекты при этом нужно как-то закрывать, уничтожать?

если их не тысячи, думаю что нет)

savage
На сайте с 10.01.2007
Offline
224
#8

Переписал код, все равно не работает так как нужно. Как в данном случае передать массив в функцию? В си++ были указатели.


<script language="JavaScript" type="text/javascript">
var xhr, xhr1, alls;
var xhrm=new Array();
var mystr=new Array();
alls="";
if (document.XMLHttpRequest)
{
xhr=new XMLHttpRequest();
}
else
{
xhr=new ActiveXObject("Microsoft.XMLHTTP");

}

function callserver(i)
{

if (document.XMLHttpRequest)
{
xhrm=new XMLHttpRequest();
}
else
{
xhrm=new ActiveXObject("Microsoft.XMLHTTP");
}
xhrm.open('GET','test.php?is_buy=on&str='+mystr, true);
xhrm.send('');
xhrm.onreadystatechange=function ()
{
if (xhrm.readyState==4)
{

if (xhrm.status == 200)
{
alls=alls.concat(xhrm.responseText);
document.getElementById('contx').innerHTML=alls;
if (i<mystr.length) i++;
else alert(mystr.length);
callserver(i);
}
}
}
}


xhr.open('GET','readfile.php', true);
xhr.onreadystatechange=function ()
{
if (xhr.readyState==4)
{
if (xhr.status == 200)
{
var mall=xhr.responseText;
var splitExp=/<br>/;
var mystr=mall.split(splitExp);
for(i=0;i<mystr.length;i++)
{
document.getElementById('contx').innerHTML+=mystr+"<br>";

}
callserver(i);
}
}
}

xhr.send('');
</script>

savage добавил 24.01.2010 в 21:17

УРА, получилось!

Вот конечный код, может кому-нить понадобится:


<script language="JavaScript" type="text/javascript">
var xhr, xhr1, alls, turl;
var xhrm=new Array();
var mystr=new Array();
alls="";
if (document.XMLHttpRequest)
{
xhr=new XMLHttpRequest();
}
else
{
xhr=new ActiveXObject("Microsoft.XMLHTTP");

}

function callserver(mystr,i)
{
alert(i);
alert(mystr);
if (document.XMLHttpRequest)
{
xhrm=new XMLHttpRequest();
}
else
{
xhrm=new ActiveXObject("Microsoft.XMLHTTP");
}
turl='test.php?is_buy=on&str='+encodeURIComponent(mystr);
//alert(turl);
xhrm.open('GET',turl, true);
xhrm.send('');
xhrm.onreadystatechange=function ()
{
if (xhrm.readyState==4)
{

if (xhrm.status == 200)
{
alls=alls.concat(xhrm.responseText);
document.getElementById('contx').innerHTML=alls;
if (i<5) i++;
callserver(mystr,i);
}
}
}
}


xhr.open('GET','readfile.php', true);
xhr.onreadystatechange=function ()
{
if (xhr.readyState==4)
{
if (xhr.status == 200)
{
var mall=xhr.responseText;
var splitExp=/<br>/;

mystr=mall.split(splitExp);
for(i=0;i<mystr.length;i++)
{
document.getElementById('contx').innerHTML+=mystr+"<br>";
}
i=0;
callserver(mystr,i);
}
}
}

xhr.send('');
</script>

Массивы в javascript в функцию передаются как ссылки автоматически.

savage добавил 24.01.2010 в 21:20

savage:
Переписал код, все равно не работает так как нужно. Как в данном случае передать массив в функцию? В си++ были указатели.

<script language="JavaScript" type="text/javascript">
var xhr, xhr1, alls;
var xhrm=new Array();
var mystr=new Array();
alls="";
if (document.XMLHttpRequest)
{
xhr=new XMLHttpRequest();
}
else
{
xhr=new ActiveXObject("Microsoft.XMLHTTP");

}

function callserver(i)
{

if (document.XMLHttpRequest)
{
xhrm=new XMLHttpRequest();
}
else
{
xhrm=new ActiveXObject("Microsoft.XMLHTTP");
}
xhrm.open('GET','test.php?is_buy=on&str='+mystr, true);
xhrm.send('');
xhrm.onreadystatechange=function ()
{
if (xhrm.readyState==4)
{

if (xhrm.status == 200)
{
alls=alls.concat(xhrm.responseText);
document.getElementById('contx').innerHTML=alls;
if (i<mystr.length) i++;
else alert(mystr.length);
callserver(i);
}
}
}
}


xhr.open('GET','readfile.php', true);
xhr.onreadystatechange=function ()
{
if (xhr.readyState==4)
{
if (xhr.status == 200)
{
var mall=xhr.responseText;
var splitExp=/<br>/;
var mystr=mall.split(splitExp);
for(i=0;i<mystr.length;i++)
{
document.getElementById('contx').innerHTML+=mystr+"<br>";

}
callserver(i);
}
}
}

xhr.send('');
</script>


savage добавил 24.01.2010 в 21:17
УРА, получилось!
Вот конечный код, может кому-нить понадобится:

Массивы в javascript в функцию передаются как ссылки автоматически.

(javascript передача массива в функцию - для гугла, если кто будет искать :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий