Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.06.2012, 16:29
Новичок на форуме
Отправить личное сообщение для ptereo Посмотреть профиль Найти все сообщения от ptereo
 
Регистрация: 01.06.2012
Сообщений: 9

универсальная Ajax-функция
всем привет.

вобщем, проблема началась тогда, когда я решил хаотичный код привести в порядок и написать функцию, которая бы это делала. Изначально код был примерно такого вида:
function xmlPicking() {

		
url = document.getElementById("target_list").value;
		
xml2 = new XMLHttpRequest();
xml2.open("GET", "./php/xml.php?url="+url, true);
xml2.send();
		
xml2.onreadystatechange = function() {
	if(xml2.readyState == 4 && xml2.status == 200 ) {
		r_file = xml2.responseText;

                xml1 = new XMLHttpRequest();
                xml1.open("POST","./upload/"+r_file+".xml",true);
                xml1.send();
			
                xml1.onreadystatechange = function() {
                     if(xml1.readyState == 4 && xml1.status == 200 ) {					                                                        result = xml1.responseText;
document.getElementById("result").innerHTML = result+
"\nr_file="+r_file;
}
}
				
}


}


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

function ajax(options) {
	// опции запроса
	options = {
		// тип запроса
		type: options.type,
		// ссылка на url запроса
		url: options.url,
		// асинхронный запрос или нет
		acync: options.acync,
		// тип возвращаемого ответа(xml, text или "")
		r_type: options.r_type,
		// функция, выполняемая в случае успешного запроса
		//onSuccess: options.onSuccess
		}
	
	var xml = new XMLHttpRequest();
	xml.open(options.type, options.url, options.acync);
		
	xml.onreadystatechange = function() {
		if(xml.status == 200 && xml.readyState == 4) {
			// возврат ответа в зависимости от типа запроса
			if(options.r_type == "xml") response = xml.responseXML;
			if(options.r_type == "text") response = xml.responseText;
			// функция, выполняемая при успешном запросе
			options.onSuccess(response);
			}
	}
	// установка соединения с сервером
	xml.send();
}


в самой программе она должна была вызываться так:

options = {
		type: "GET",
		url: "./php/xml.php?file="+document.getElementById("target_list").value,
		acync: true,
		r_type: "text"
	}
	ajax(options);


и все бы хорошо, но вот не удается мне с такой функцией сделать асинхронный запрос, только синхронный. Как бы я не пытался втулить onSuccess: someFunction(response) оно не хочет выполняться. Но вообще если в onSuccess поставить какую-нибудь простую функцию, типа test() {alert(1);} оно выполнится.

Моя просьба: помогите разобраться, как правильно в моем случае составить асинхронный запрос и как правильно сделать, если нужно вложенное выполнение функций(как в первом куске кода)
Ответить с цитированием
  #2 (permalink)  
Старый 01.06.2012, 16:39
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от ptereo Посмотреть сообщение
и все бы хорошо, но вот не удается мне с такой функцией сделать асинхронный запрос, только синхронный. Как бы я не пытался втулить onSuccess: someFunction(response) оно не хочет выполняться.
Нужно передавать
onSuccess: someFunction
Ответить с цитированием
  #3 (permalink)  
Старый 01.06.2012, 16:46
Новичок на форуме
Отправить личное сообщение для ptereo Посмотреть профиль Найти все сообщения от ptereo
 
Регистрация: 01.06.2012
Сообщений: 9

попробовал. не работает. допустим, мне нужно вывести в текущем запросе результат этого запроса.
есть функция
function test() {
    alert(response);
}

по идее, она должна параметром этот самый ответ получать.
если я в асинхронном запросе ее вызываю, мне выводит результат предыдущего запроса, вероятно потому, что функция объявлена ранее.
или я чего-то не понимаю
Ответить с цитированием
  #4 (permalink)  
Старый 01.06.2012, 16:50
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

function test(res) {
    alert(res);
}

и далее
onSuccess:test

------------------
Вы же response как параметр в функцию передаете
Ответить с цитированием
  #5 (permalink)  
Старый 01.06.2012, 17:03
Новичок на форуме
Отправить личное сообщение для ptereo Посмотреть профиль Найти все сообщения от ptereo
 
Регистрация: 01.06.2012
Сообщений: 9

в том и дело, что передаю, но оно не работает. попробовал. может неправильно объявляю? options.onSuccess(arg) игнорирует в функции ajax, я могу его в ней явно не объявлять и прописать при вызове, когда options задаю, оно будет работать с таким же успехом
Ответить с цитированием
  #6 (permalink)  
Старый 01.06.2012, 17:12
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

вот так напишите-будет работать?
options = {
		type: "GET",
		url: "./php/xml.php?file="+document.getElementById("target_list").value,
		acync: true,
		r_type: "text",
   onSuccess:function (res) { alert(res);
}

	}
	ajax(options);
Ответить с цитированием
  #7 (permalink)  
Старый 01.06.2012, 17:21
Новичок на форуме
Отправить личное сообщение для ptereo Посмотреть профиль Найти все сообщения от ptereo
 
Регистрация: 01.06.2012
Сообщений: 9

не работает. при том, что сам запрос выполняется
Ответить с цитированием
  #8 (permalink)  
Старый 01.06.2012, 17:25
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Вы меня в тупик поставили простейший пример и не работает
там где написано
options.onSuccess(response);
впереди напишите alert(response);alert(options.onSuccess);
что алерты скажут?
Ответить с цитированием
  #9 (permalink)  
Старый 01.06.2012, 17:39
Новичок на форуме
Отправить личное сообщение для ptereo Посмотреть профиль Найти все сообщения от ptereo
 
Регистрация: 01.06.2012
Сообщений: 9

alert(response) - выводит нормальный ответ, результат запроса. alert(options.onSuccess) - выводит тело функции onSuccess,
а вот вывод alert(options.onSuccess(response)) выводит undefined в итоге функция не выполняется.
Ответить с цитированием
  #10 (permalink)  
Старый 01.06.2012, 17:46
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от ptereo Посмотреть сообщение
alert(response) - выводит нормальный ответ, результат запроса. alert(options.onSuccess) - выводит тело функции onSuccess,
а вот вывод alert(options.onSuccess(response)) выводит undefined в итоге функция не выполняется.
alert(options.onSuccess(response)) правильно выводит undefined
а почему не работает options.onSuccess(response)
загадка для меня-мы имеем функцию
function(res){alert(res)}
в нее передаем параметр который получили и поместили в response
и она должна его вывести в алерте
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax и Json callback функция borabora Prototype & script.aculo.us 0 30.01.2012 15:01
AJAX. Функция click() по динамическому объекту max161616 AJAX и COMET 3 06.11.2011 17:07
Универсальная функция для сворачивания нескольких типовых блоков fennick Элементы интерфейса 7 26.09.2011 13:23
Универсальная функция Ajax запроса Finesse AJAX и COMET 21 15.06.2011 17:17
Универсальная функция для формы Nightmare Общие вопросы Javascript 5 16.04.2010 18:42