2014-01-14 2 views
0

я использую XmlHttp с сервлеты следующим образом:не удается остановить функцию, если XMLHTTPRequest.responseText равно определенное значение

function btnSave_onclick(){ 

var xmlHttp; 
var responseText; 

if (condition){ 

    var para= "someParamsHere"; 

    var url = "urlHere"; 

    if (window.XMLHttpRequest) { 
     xmlHttp = new XMLHttpRequest(); 
    } 

    else if (window.ActiveXObject) { 
     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    xmlHttp.open('post', url, true); 
    xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); 
    xmlHttp.setRequestHeader("Content-length", para.length); 
    xmlHttp.setRequestHeader("Connection", "close"); 

    xmlHttp.send(para); 

    xmlHttp.onreadystatechange=function() { 
     if (xmlHttp.readyState==4) { 
      if(xmlHttp.status==200){ 
       responseText=xmlHttp.responseText; 
       if(responseText=='error'){ 
        alert("Fatal Error Occurred"); 
        return; 
       } 
      } 
     } 
    } 

} 

// some other code here 

} 

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

+0

вы уверены, что ваш текст ответа на самом деле «ошибка» (нижний регистр и без пробелов)? – fcalderan

+0

@Fabrizio Calderan, так как я сказал, что он печатает предупреждение («Fatal Error Occurred»); это означает, что responseText - это ошибка, как ожидалось, но проблема в том, что она игнорирует возврат и переходит к следующему блоку –

ответ

1

Вам не хватает точки «A» в AJAX, то есть асинхронности. Код внутри внутренней функции (xmlHttp.onreadystatechange=function() {...HERE...}) выполняется асинхронно. Это означает, что вся внешняя функция (btnSave_onclick()) будет выполнена, и через некоторое время будет запущен onreadystatechange (если вообще). В псевдокоде, и предполагая condition === true для простоты, что ваш код:

function btnSave_onclick() { 
    doAjaxAndWhenItFinishesRun(function(responseText) { 
     if(responseText=='error') handleFatalError(); 
     else handleSuccess(); 
    }); 
    doStuff(); 
} 

Позвольте мне переписать, но на этот раз без внутренней функции:

function ajaxFinished(responseText) { 
    if(responseText=='error') handleFatalError(); 
    else handleSuccess(); 
} 

function btnSave_onclick() { 
    doAjaxAndWhenItFinishesRun(ajaxFinished); 
    doStuff(); 
} 

Я считаю, что это яснее, что btnSave_onclick() работает 2 вещи, первый - это асинхронный вызов, а затем doStuff(). Когда и , если асинхронный вызов завершается, то вызывается ajaxFinished(). Решение, если doStuff() это работать только в случае успеха, это вызвать его из handleSuccess() в примере выше, или, в вашем случае, здесь:

function btnSave_onclick(){ 
    ... 
    if (condition){ 
     ... 
     xmlHttp.onreadystatechange=function() { 
      if (xmlHttp.readyState==4) { 
       if(xmlHttp.status==200){ 
        responseText=xmlHttp.responseText; 
        if(responseText=='error'){ 
         alert("Fatal Error Occurred"); 
        } 
        else { 
         // some other code here 
         // ... this code will run on success 
        } 
       } 
      } 
     } 
    } 

    // any code here will run anyway and BEFORE the AJAX completes 
} 
Смежные вопросы