如果xmlhttprequest.responseText等于特定值,则无法停止函数

时间:2014-01-14 09:29:41

标签: javascript ajax servlets xmlhttprequest

我正在使用XmlHttp和java servlet,如下所示:

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

}

代码发布到servlet,并且在servlet中如果发生异常我打印到响应文本包含字符串'error',问题是出现错误警告但是代码继续到块//这里有一些其他代码含义返回不退出js函数,请指教。

1 个答案:

答案 0 :(得分:1)

你错过了AJAX中的“A”点,即异步性。内部函数(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件事,第1件恰好是异步调用,然后是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
}