我正在使用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函数,请指教。
答案 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
}