AJAX: как заставить код "подождать" пока вернется и обработается результат?

vd

Новичок
AJAX: как заставить код "подождать" пока вернется и обработается результат?

Столкнулся с проблемой, как я понимаю, связанной со спецификой AJAX:

Есть три функции:
Первая вызывается извне и ДОЛЖНА вернуть результат выполнения.
По сути она вызывает стандартную функцию соедининия посредством AJAX, указывая в т.ч. и callback функцию:
Код:
function spellCheck() {  	
    var strWordList = wordList.join(",");  	
    var postData = "wordlist="+encodeURIComponent(strWordList);  	
    var url = "/admin/spell/spell_checking.php?Lang="+Lang;  	
    var callBackFunction = "spellResultHandle";	  	
    ajaxConnect(url, postData, callBackFunction);  	
    return spellResult;
}
Это собственно AJAX connector, стандартный, почти, но только еще передает данные через POST:
Код:
function ajaxConnect(url, postData, callBackFunction) {
	var xmlObj = new Object();	
	if (window.XMLHttpRequest) {
		xmlObj = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Error initializing XMLHttpRequest");
		return;
	}
	xmlObj.onreadystatechange = function(){ 
		if(xmlObj.readyState == 4){
			if (xmlObj.status == 200) {
				var elArr = xmlObj.responseXML.getElementsByTagName('root')[0].childNodes;
				if (callBackFunction != "") {
					eval(callBackFunction+"(elArr);");
				} else {
					return true;
				}
			} else {
				alert("There was a problem retrieving the XML data");
				return false;
			}
     	} 
	}
	xmlObj.open("POST",url,true);
	xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
         xmlObj.send(postData);
}
Это собственно callback функция. Вызывается после получения данных с сервера.
И формирует некоторый массив результатов spellResult, который должна вернуть первая функция
Код:
function spellResultHandle (elArr) {
	elCount = elArr.length;
	spellResult = new Array();
	for (var i=0; i<elCount; i++) {
		var el = new Array();
		var ind = elArr[i].childNodes[0].firstChild.data;		
		el.word = wordList[ind];
		el.obj = findObjLink(ind);
		if (elArr[i].childNodes[1].firstChild.data=='none') {
			el.suggestions = new Array();
		} else {
			el.suggestions = elArr[i].childNodes[1].firstChild.data.split(",");
		}
		spellResult.push(el);
	}
	wordList = null;
	nodesMap = null;
}
Суть вопроса в том, что код продолжает выполняться, пока данные еще не вернулись и первая функция генерирует ошибку, т.к. натыкается на spellResult, которого еще нет.

Уверен, что не первый столкнулся с подобной проблемой, буду благодарен за информацию или ссылки на таковую.
 

whirlwind

TDD infected, paranoid
Если prototype, то

Код:
    var request = new Ajax.Request( src, { asynchronous: false } );
	// test response success...
	var text = request.transport.responseText;
-~{}~ 03.08.06 15:17:

PS. если хочется гемороя, то создайте замыкание, примерно

var lock = true;
xmlObj.onreadystatechange = function(){ lock = false; }
while ( lock ){
// wait
};
 

vd

Новичок
Автор оригинала: whirlwind
Если prototype, то

Код:
    var request = new Ajax.Request( src, { asynchronous: false } );
	// test response success...
	var text = request.transport.responseText;
Не понял :(

PS. если хочется гемороя, то создайте замыкание, примерно
var lock = true;
xmlObj.onreadystatechange = function(){ lock = false; }
while ( lock ){
// wait
};
Гемороя не хочется, т.к. он сильно тормозит систему, особенно в случае длительного получения и обработки результата. А это неприемлемо.
Наверное есть смысл попробовать проверять через интервал, в полсекунды, наприме... Просто подумал может быть есть более элегантные решения.
 

whirlwind

TDD infected, paranoid
а теперь я не понял... оказывается... в чем проблема. Вам нужен асинхронный или синхронный запрос? Если асинхронный, то он у вас есть. Синхронный вам может понадобиться например для получения кода.


Вот это вам не нужно

eval(callBackFunction+"(elArr);");

пишите просто

callBackFunction(elArr);

Собственно, вопрос сформилуирован не очень понятно. Если вы подгружаете колбек функцию, то у вас не будет после eval-а в контексте страницы, соответственно будет возникать ошибка. Типом запроса ситуация не исправится. Посмотрите мой соседний топик про "Mozilla и подгрузка Javascript". Там как раз вопрос про подгрузку кода.

-~{}~ 03.08.06 16:15:

PS. Если я все еще не в теме, отфильтруйте лишнее (нафига тут коннектор) и оставьте ту часть, где у вас возникает ошибка.

-~{}~ 03.08.06 16:16:

PPS. нигде не вижу, где у вас сама callBackFunction, на которую вы ссылаетесь в spellCheck

-~{}~ 03.08.06 16:18:

блин, понял

var callBackFunction = "spellResultHandle";

замените на

var callBackFunction = spellResultHandle;
 

vd

Новичок
Премного благодарен за советы и комментарии. Все работает:)
 
Сверху