всем привет.
вобщем, проблема началась тогда, когда я решил хаотичный код привести в порядок и написать функцию, которая бы это делала. Изначально код был примерно такого вида:
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);} оно выполнится.
Моя просьба: помогите разобраться, как правильно в моем случае составить асинхронный запрос и как правильно сделать, если нужно вложенное выполнение функций(как в первом куске кода)