2010-01-20 2 views
1

Всякий раз, когда я запускаю этот файл, код запускается до точки, где срабатывает функция отправки, а затем она срабатывает только в том случае, если у меня есть функция оповещения непосредственно за ней, если я вынимаю предупреждение («отправлено»); затем он отвечает ServerReadyyState: 1.Функция отправки Ajax не будет?

В чем может быть проблема? Кто-то, пожалуйста, помогите, я попробовал это на своей локальной машине и на моем личном сервере и получил те же результаты. Любая помощь приветствуется.

Кодекс:

/** 
* @author d 
*/ 
var xhr; 

function getPlants(xhr) { 
    try { 
    xhr = new XMLHttpRequest(); 
    } catch (microsoft) { 
    try { 
     xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
    } catch (othermicrosoft) { 
     try { 
     xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch (failed) { 
     xhr = false; 
     alert("ajax not supported"); 
     } 
    } 
    } 
    xhr.open("GET", "db_interactions.php", true); 


    xhr.send(null); 
    alert("sent"); //the send function only works if this alert functions is here 
    if (xhr.readyState == 4) { 

    return xhr.responseText; 
    } else { 
    alert("Server ReadyState is:" + xhr.readyState); 
    xhr.abort(); 
    //getPlants(xhr);  
    } 
} 

ответ

1

AJAX является asynchronus. Вы не можете сразу проверить состояние готовности.

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

xhr.onreadystatechange = function() { alert('It changed!') } 

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

+0

Спасибо, что это помогает –

0

Запросы занимают некоторое время. При добавлении предупреждения() код останавливается до тех пор, пока пользователь не наберет ОК. Поэтому, когда вы удаляете его, запрос отправляется и проверяется немедленно. В результате незаконченный запрос.

При изменении кода на это:

xhr.onreadystatechange=state_change 
xhr.send(null); 

function state_change() { 
    if(xhr.readyState==4) { 
     return xhr.responseText; 
    } else { 
     alert("Server ReadyState is:"+xhr.readyState);  
    } 
} 

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

+0

Спасибо, что помогли много –

Смежные вопросы