Как попасть внутрь процедуры. Выполнение двух AJAX параллельно

kpp

Новичок
Как попасть внутрь процедуры. Выполнение двух AJAX параллельно

Начну по порядку.

Проблема в том, что я не могу конкретно передать имя нужного мне объекта, а точнее сам объект в процедуру.
Я взял более-менее готовый код для реализации AJAX-приложения.

Вот код самой html-странички:
PHP:
<html>
<head>
<title>show</title>
</head>
<body>
<script language="JavaScript" src="./createRequestObject.js"></script>
<script language="JavaScript" src="./processReqChange.js"></script>
<script>

function go(){
	req = createRequestObject();
	nameTarget="textNow";
	req.onreadystatechange = processReqChange;
	req.open("GET", "./proc.php?hash=" + Math.random(), true);
	req.send(null);
}
function goO(){
	req = createRequestObject();
	nameTarget="textNowO";
	req.onreadystatechange = processReqChange;
	req.open("GET", "./procO.php?hash=" + Math.random(), true);
	req.send(null);
}
</script>


<textarea style="height:150px; width:180px" id="textNow">
</textarea>
<textarea style="height:150px; width:180px" id="textNowO">
</textarea>
<br>
<input type="button" value="go" onclick="go()" style="width:180px">
<input type="button" value="go" onclick="goO()" style="width:180px">
</body>
</html>

В ней две кнопки и два текстарея в которые пишется время по-разному.


Вот код JavaScript-овый:

PHP:
function processReqChange()
{ 
	document.getElementById(nameTarget).innerHTML=stat(req.readyState)+"\n";
	try { // Важно!
	// только при состоянии "complete"
	if (req.readyState == 4) {
		// для статуса "OK"
		if (req.status == 200) {
			// здесь идут всякие штуки с полученным ответом
			document.getElementById(nameTarget).innerHTML+=(req.responseText);
		} else {
			alert("Не удалось получить данные:\n" + req.statusText);
		}
	}
}
	catch( e ) {
      alert('Caught Exception: ' + e.description);
  }
}

function stat(n)
{
	switch (n) {
		case 0:
			return "не инициализирован"; break;
		case 1: 
			return "загрузка..."; break;
		case 2: 
			return "загружено"; break;
		case 3: 
			return "в процессе..."; break;
		case 4: 
			return "готово"; break;
		default:
			return "неизвестное состояние";  
	}  
}

Ну и, конечно, создание объекта RequestObject, хотя на него можно и не смотреть, тут всё в порядке:
PHP:
function createRequestObject()
{
	if (window.XMLHttpRequest) {
		try {
			return new XMLHttpRequest();
		} catch (e){}
	} else if (window.ActiveXObject) {
		try {
			return new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e){}
		try {
			return new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e){}
	}
			return null;
}

Головной вопрос в том, как разграничить эти два запроса. Когда выполняется один, он ещё не выполнилс до конца, я нажимаю кнопку для запуска второго - тут первый обрывается и начинается второй.
Причина понятна, переменная называется одним именем. Но как сделать так, чтобы функция (или процедура, не знаю как это назвать, параметров ей передавать почему-то нельзя - ошибка) processReqChange() принимала объект нужный и там уже всё что надо с ним вытворяла.

Как передать в эту процедуру параметр? Ей даже скобки нельзя поставить в конце - ошибка.

Вот эта таинственная строка "req.onreadystatechange = processReqChange;"

Не создавать же две функции processReqChange для двух параллельных запросов. Как видно по коду внутри сейчас у неё глобальная переменная req, иначе к ней внутрь не пробраться.


Надеюсь всё чётко объяснил. Целый день пропыхтел с этим делом. В статьях по ажаксу об этом не упоминают, считая это недостойным внимания желом.
 

dimagolov

Новичок
создавай два объекта - req1 и req2 (в общем, сколько нужно, отслеживай занятость их) и ссылайся в processReqChange не на req, а на this, по логике processReqChange будет выполняться как раз в контексте объекта запроса
 

-SkyNet-

Новичок
не обязательно передавать. можно использовать глобальную (для processReqChange) переменную
 

dimagolov

Новичок
-SkyNet-, ну читай же вопрос, блин, внимательно. у автора проблема была именно в том, что запроса 2 а данные (объект) используються одни. твоя глобальная переменная тем более будет одна и толку от нее не будет никакого.
 

-SkyNet-

Новичок
dimagolov
цитата:"Как передать в эту процедуру параметр? Ей даже скобки нельзя поставить в конце - ошибка. "

передавая в эту функцию некий идентификатор запроса, можно будет в нужный момент запросить нужную информацию

-~{}~ 16.06.08 17:35:

а вообще, для эффективного использования асинхронных запросов, гораздо удобнее использовать библиотеку и плагин менеджмента запросов.

например jQuery и jquery.ajaxManager соответственно
 

dimagolov

Новичок
а вообще, для эффективного использования асинхронных запросов, гораздо удобнее использовать библиотеку и плагин менеджмента запросов.
эффективно понимать, что происходит в клиент-серверном ассинхронном приложении реального времени. но не все хотят разбираться в этом... либу да, пользовать проще, и для многих это выход, не спорю.
 

NightFlash

Новичок
сам в свое время долго мучался с непониманимаем :) вникнив каждую функцию и в области действия переменных. Напиши себе класс асинхронного запроса и радуйся жизни :)
 
Сверху