AJAX: можно ли получить ответ без использования callback функции?

woodfairy

Новичок
AJAX: можно ли получить ответ без использования callback функции?

Есть такой классик.
PHP:
function NetLoader()
{

}

NetLoader.prototype = {
	GetTransport: function()
	{
		var transport;
		if(window.XMLHttpRequest)
		{
			transport = new XMLHttpRequest();
		}
		else
		{
			if(window.ActiveXObject)
			{
				try {
					transport = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (err) {
					transport = new ActiveXObject("Microsoft.XMLHTTP");
				}
			}
		}
		return transport;
	},

	LoadXMLDoc: function(Url,PostParams,OnLoad,OnError)
	{
		this.Url = Url;
		this.Req = null;
		this.OnLoad = OnLoad;
		this.OnError = (OnError) ? OnError : this.DefaultError;
		
		this.Req = this.GetTransport();
		if(this.Req)
		{
			try
			{
				var Loader = this;
				this.Req.onreadystatechange = function(){
					Loader.OnReadyState.call(Loader);
				}
				this.Req.open('POST',Url,true);
				this.Req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
				var x = this.Req.send(PostParams);
			}
			catch (err)
			{
				this.OnError.call(this);
			}
		}
	},
	
	OnReadyState: function(){
		var Req = this.Req;
		var Ready = Req.readyState;
		if(Ready == READY_STATE_COMPLETE)
		{
			var HttpStatus = Req.status;
			if(HttpStatus == 200 || HttpStatus == 0)
			{
				this.OnLoad(Req.responseXML);
			}
			else
			{
				this.OnError.call(this);
			}
		}
	},
	
	DefaultError: function(){
		alert("error fetching data!\n\nreadyState:" + this.Req.readyState + "\nStatus:" + this.Req.Status + "\nheaders:" + this.Req.getAllResponseHeaders());
	}
}
можно ли как-то избежать вызова функции OnReadyState, чтобы данные от сервера возвращались в функцию, которая делает запрос к серверу?

т.е. чтобы в идеале вызов выглядел так:
PHP:
var xml = LoadXMLDoc(параметры);
а в результате в переменной xml содержался ответ сервера.
 

Solid

Drosera anglica
woodfairy
Зачем вы создаёте ещё один велосипед?
В JavaScript class'ов нет.
 

woodfairy

Новичок
я не изобретаю велосипедов :)

Вы можете ответить на вопрос: можно ли отказаться от callback функции и при этом получить ответ от сервера?
 

BRat

o_0
woodfairy
PHP:
var xml = LoadXMLDoc(параметры);
тебе понятие асинхронность знакомо?
 

woodfairy

Новичок
Асинхронность - характеристика процессов, не совпадающих по времени.
В данном конкретном случае мы делаем запрос на сервер, причем заранее неизвестно, когда придет ответ. Одновременно с этим код, сделавший запрос на сервер, продолжает выполняться.
 

BRat

o_0
woodfairy
одновременно с этим js-код продолжает выполняться
тебя это ни на какие мысли не наводит? например что мы не знаем, когда переменная xml будет инициализирована?
можно ли отказаться от callback функции и при этом получить ответ от сервера?
при использовании xmlhttp + асинхронность - нет

http://algolist.manual.ru/ajax_js.zip
 

woodfairy

Новичок
конечно, наводит.

вот только чтобы придумать что-то новое, интересное, нужно уходить от стереотипов. вдруг мы что-то не учитываем.

callback функция вызывается, когда состояние readyState меняется, следовательно, можно как-то организовать активное ожидание изменения этого состояния.

сходу
var i=0;
var firstReadyState = this.Req.readyState;
while (firstReadyState == this.Req.readyState) {i++;}
не помогло.

вот если бы туда поставить какой-нибудь sleep, то, возможно, получится.
 

Solid

Drosera anglica
woodfairy
Для того, что бы уйти от стереотипов, Вам, в начале, надо изучить хотя бы основы того, что вы собираетесь ломать потому что не зная обычного, невозможно создать необычное, т.к. в 99% случаев вы в любом случае создадите то, что уже давным давно было создано до вас...
 

woodfairy

Новичок
Спасибо, ребята, вы все очень добрые :)

Извините за плохой язык. Похоже, я должна была просто спросить, можно ли сделать синхронный запрос на сервер вместо асинхронного. Можно. Для этого нужно здесь this.Req.open('POST', Url, true); изменить третий параметр на false.

А если вы считаете, что где-то я по полной туплю (как и оказалось в общем-то), то лучше подкреплять это ссылками или объяснениями. Хотя, конечно, проще сказать "Садись, Вовочка, два", чем объяснять Вовочке, в чем его ошибка. Впрочем вы не мои учителя, так что претензий собственно быть не может.

Еще раз спасибо за интерес к теме.

Solid, чуть не забыла. Действительно, я бы создала велосипед :) Зато если бы Вы показали мне этот велосипед сразу, то благодарности моей не было бы предела :)

P.S. Я скоро отредактирую первый пост, чтобы не вводить в заблуждение народ глупостями.
 

alekciy

Новичок
woodfairy
Что бы получить хороший ответ, нужно задать корректный вопрос. Правильно заданный вопрос, это даже большем, чем половина ответа. А если бы сразу сразу спросила, что нужен банальный синхронный ответ, то получила бы сразу ответ без всяких Вовочек.
 
Сверху