Проблемы с запуском двух и более функций с использованием Ajax

Pavel6

Новичок
Проблемы с запуском двух и более функций с использованием Ajax

При загрузки страницы сразу должны запускаться две функции test() и test2(), но в мазиле запускается только последняя, т.е. test2(), а test() не запускается.
Подскажите, пожалуйста в чем может быть проблема.

var prefix_func;
var req;


function loadXMLDoc (url,prefix)
{

prefix_func = prefix;

// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = processReqChange;
req.open("GET", url, true);
req.send(null);
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = processReqChange;
req.open("GET", url, true);
req.send();
}
}
}




function processReqChange ()
{
// only if req shows "complete"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {

if(prefix_func != null){eval(prefix_func + '();'); }

} else {
alert("Ошибка!\n");
}
}
}


function tpl(){
// Функция обработки XML файла, но у меня пока просто alert
alert('www1*');
}

function tpl2(){
// Функция обработки XML файла, но у меня пока просто alert
alert('www2');
}

function test(){
url = 'php_ajax_script/test.php?if=3';
loadXMLDoc(url,'tpl'); // tpl - это мы указываем какая функция обработает XML файл, и результат передаст в виде Html
}

function test2(){
url = 'php_ajax_script/test.php?if=1';
loadXMLDoc(url,'tpl2'); // tpl2 - это мы указываем какая функция обработает XML файл, и результат передаст в виде Html
}


test(); // Первая функция у меня не срабатывает!
test2(); // А эта срабатывает! ПОЧЕМУ, помогите мне разобраться.
 

ksnk

прохожий
test2 срабатывает 2 раза? Можно подумать над тем как изменяется значение глобальной переменной prefix_func
 

Pavel6

Новичок
Автор оригинала: ksnk
test2 срабатывает 2 раза? Можно подумать над тем как изменяется значение глобальной переменной prefix_func
Логически оно должно изменяться по порядку, при запуске test() на одно, а при test2() на другое.
Но оно ведь не работает.
 

Geol

Пациент
Автор оригинала: Pavel6
Логически оно должно изменяться по порядку, при запуске test() на одно, а при test2() на другое.
Но оно ведь не работает.
Обработка происходит асинхронно, то есть test2() вызывается до завершения работы test().
 

Pavel6

Новичок
Автор оригинала: Geol
Обработка происходит асинхронно, то есть test2() вызывается до завершения работы test().
А как можно сделать проверку на выполнения функции, и ты не мог мне привести пример
 

Pavel6

Новичок
Автор оригинала: Koc9k
сделать передачу данных неасинхронной ?
Я правда не много не пойму, Вы можете привести пример или скинуть ссылки на акие нибудь статьи
 

sayber

Новичок
может, все таки не использовать глобальные переменные?
 

dimagolov

Новичок
Pavel6 и всем начинающим веб-программистам.
Попробуй в ролях (броузер, глобальная переменная, сервер, интерпретаторы) разыграть сценку "отправка и обработка двух асинхронных запросов" до полного понимания того что из-за чего происходит и что из этого получается. Не забываем и то, что в теории в tcp/ip (а значит и в http) первый отправленный запрос может быть получен сервером после следующих, а с учетом обработки на сервере ответ клиенту тем более может приходить в совсем другом порядке относительно отправки.
 

Pavel6

Новичок
Автор оригинала: dimagolov
Pavel6 и всем начинающим веб-программистам.
Попробуй в ролях (броузер, глобальная переменная, сервер, интерпретаторы) разыграть сценку "отправка и обработка двух асинхронных запросов" до полного понимания того что из-за чего происходит и что из этого получается. Не забываем и то, что в теории в tcp/ip (а значит и в http) первый отправленный запрос может быть получен сервером после следующих, а с учетом обработки на сервере ответ клиенту тем более может приходить в совсем другом порядке относительно отправки.
А в обще реально запустить сразу несколько функций, Вы можете привести какой не будь пример, а то я немогу разобраться.
Буду очень рад если Вы мне поможете
 

ksnk

прохожий
Автор оригинала: Pavel6
А в обще реально запустить сразу несколько функций...
- убрать prefix_func напроч...
- заменит в 2-х местах
req.onreadystatechange = processReqChange;
на
req.onreadystatechange = function (){processReqChange(prefix)};
- заменить processReqChange на
function processReqChange (func)
{
// only if req shows "complete"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {

if(func) func();

} else {
alert("Ошибка!\n");
}
}
}
- убрать кавычки при вызове loadXMLDoc - loadXMLDoc(url,tpl2);
Должно заработать...
 

dimagolov

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

ksnk

прохожий
почитай в мануале...
Все равно не разберусь,...
Я не могу объяснить человеку, что такое "замыкание" в Javascript, так как когда я начинаю представлять себе чего это стоит броузеру, меня самого посещает мозговой паралич :)
 

AmdY

Пью пиво
Команда форума
Pavel6, а попробуй использовать готовые AJAX библиотеки, например с dklab.ru, плюс великолепная штука как prototype.org
 

Pavel6

Новичок
Автор оригинала: ksnk
- убрать prefix_func напроч...
- заменит в 2-х местах
req.onreadystatechange = processReqChange;
на
req.onreadystatechange = function (){processReqChange(prefix)};
- заменить processReqChange на
function processReqChange (func)
{
// only if req shows "complete"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {

if(func) func();

} else {
alert("Ошибка!\n");
}
}
}
- убрать кавычки при вызове loadXMLDoc - loadXMLDoc(url,tpl2);
Должно заработать...
Всем большое спасибо кто пытался мне помочь, но проблема заключалось не в этом, просто нужно было не делать переменную req глобально, а обнулять ее всякий раз при обращении к функции loadXMLDoc, и в дальнейшем передавать её косвенно.

И при запуске нескольких функций одновременно все работает

Вот код

function loadXMLDoc (url,prefix)
{
var req = false
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = function(){ processReqChange(req,prefix); }
req.open("GET", url, true);
req.send(null);
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = function(){ processReqChange(req,prefix); };
req.open("GET", url, true);
req.send();
}
}
}

function processReqChange (req,prefix)
{
// only if req shows "complete"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {

if(prefix){ prefix(req); }

} else {
alert("Îøèáêà!\n");
}
}
}
 

dimagolov

Новичок
knsk Верить? вывод то все равно не верный:
просто нужно было не делать переменную req глобально, а обнулять ее всякий раз при обращении к функции loadXMLDoc, и в дальнейшем передавать её косвенно.
к проблеме запуска только последней функции из вызванных это не имеет никакого отношения...
а вот кодом твоим Pavel6 таки воспользовался ;)
 
Сверху