Показать сообщение отдельно
  #1 (permalink)  
Старый 04.12.2010, 19:32
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

ajax, завершение функии до получения ответа
Всем доброго времени суток!
Есть следующая ситуация: создаю специальную функцию которая при вызове создает объект XMLHttpRequest() и шлет определенные запросы на сервер.

далее вызываю эту функцию дважды

alert('запрос на запись');
        sendAnsServ(('insertParts.php?name='+ mas_nameM + '&country=' + mas_country + '&idMode=newMark'), 8, '');
alert('запрос на выборку');
       sendAnsServ(('insertParts.php?name='+ mas_nameM + '&idMode=selMark'), 8, '');


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

код функции примерно такой:
function sendAnsServ(pId, mode, id)
{
var xmlhttp = getXmlHttp();
xmlhttp.open('GET', pId + '&mode=' + mode, true);
xmlhttp.onreadystatechange = function() 
{
if (xmlhttp.readyState == 4) 
{
if(xmlhttp.status == 200) 
{
...
if(mode == 8)
  {
    document.getElementById('resServ').value = xmlhttp.responseText;
  }
}
}
}
xmlhttp.send(null);
}


как сделать чтобы функция не завершалась до момента получения ответа с сервера?

если написать что-то типа:

function sendAnsServ(pId, mode, id)
{
//alert(pId + " " + mode + " " + id);
var xmlhttp = getXmlHttp();
xmlhttp.open('GET', pId + '&mode=' + mode, true);
var flag = true;
while(xmlhttp.readyState != 4)
{
xmlhttp.onreadystatechange = function() 
{
if (xmlhttp.readyState == 4) 
{
if(xmlhttp.status == 200) 
{
...
if(mode == 8)
{
document.getElementById('resServ').value = xmlhttp.responseText;
}
}
}
}
if(flag)
{
xmlhttp.send(null);
flag = false;
}
}
}


то это приводит к циклу который грузит браузер, да и эксплорер постоянно предлагает прекратить выполнение скриптов. Помогите решить проблему пожалуйста
Ответить с цитированием