+ -
当前位置:首页 → 问答吧 → ajax 同步问题

ajax 同步问题

时间:2011-09-15

来源:互联网

function xx(form){
var yzm = form.yzm.value;
var url = "chkyzm.php?yzm="+yzm;
var isy = false;
xmlhttp.open("GET",url,true);
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4){
var msg = xmlhttp.responseText;
if(msg == 2){
alert("验证码输入错误!");
form.yzm.value = "";
form.yzm.focus();
RefreshImage(form);
}else if(msg == 1){
isy = true;
}else{
alert("未知错误!");
}
}
alert("*****11111*****");
}
xmlhttp.send(null);
alert("*****22222*****");
return isy;
}
此代码中 alert("*****11111*****"); 会执行好多次, 该代码执行完一次 执行 alert("*****22222*****");
然后继续执行 alert("*****11111*****");
我要实现的 执行完xmlhttp.onreadystatechange = function()方法 然后继续往下执行,不然 isy结果不是我要的
麻烦各位了

作者: sle1324587   发布时间: 2011-09-15

异步操作的话,只能在回调函数内继续执行相关操作
可以把 isy 作为全局变量操作

HTML code

<script>
var isy = false;
function xx(form){
    var yzm = form.yzm.value;
    var url = "chkyzm.php?yzm=" + yzm + "&" + escape(new Date());
    xmlhttp.open("GET",url,true);
    xmlhttp.onreadystatechange = function(){
        if(xmlhttp.readyState == 4){
            var msg = xmlhttp.responseText;
            if(msg == 2){
                alert("验证码输入错误!");
                form.yzm.value = "";
                form.yzm.focus();
                RefreshImage(form);
            }else if(msg == 1){
                isy = true;
                //DO_NEXT();
            }else{
                alert("未知错误!"); 
            }
            alert("*****11111*****");
        }
    }
    xmlhttp.send(null);
}
</script>


作者: hookee   发布时间: 2011-09-15

改成同步的,要么就要将你要在ajax执行完毕后的代码在回调完成后执行,而不是return,没意义


  JScript code
  function xx(form) {
        var yzm = form.yzm.value;
        var url = "chkyzm.php?yzm=" + yzm;
        var isy = false;
        xmlhttp.open("GET", url, false);//////改成同步的,不需要状态转换函数
        /*xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4) {
                var msg = xmlhttp.responseText;
                if (msg == 2) {
                    alert("验证码输入错误!");
                    form.yzm.value = "";
                    form.yzm.focus();
                    RefreshImage(form);
                } else if (msg == 1) {
                    isy = true;
                } else {
                    alert("未知错误!");
                }
            }
            alert("*****11111*****");
        }*/
        xmlhttp.send(null);
        /////////////////////////send完后可以直接使用xhr对象属性
        var msg = xmlhttp.responseText;
        if (msg == 2) {
            alert("验证码输入错误!");
            form.yzm.value = "";
            form.yzm.focus();
            RefreshImage(form);
        } else if (msg == 1) {
            isy = true;
        } else {
            alert("未知错误!");
        }
       // alert("*****22222*****");
        return isy;
}

作者: showbo   发布时间: 2011-09-15

因为异步的问题 所以isy这个变量必须要在回调函数中处理 
JScript code
function xx(form,callback){
    var yzm = form.yzm.value;
    var url = "chkyzm.php?yzm=" + yzm + "&" + escape(new Date());
    var isy = false;
    xmlhttp.open("GET",url,true);
    xmlhttp.onreadystatechange = function(){
        if(xmlhttp.readyState == 4){
            var msg = xmlhttp.responseText;
            if(msg == 2){
                alert("验证码输入错误!");
                form.yzm.value = "";
                form.yzm.focus();
                RefreshImage(form);
            }else if(msg == 1){
                isy = true;
            }else{
                alert("未知错误!"); 
            }
            alert("*****11111*****");
            callback(isy);//直接执行callback 将isy作为参数传入
        }
    }
    xmlhttp.send(null);
}

将来你就可以这么调用xx  
 
xx(你的form,function(flag){
  //这个flag就是你的isy经过ajax处理后的值
  //...do next
})

作者: fanchuanzhidu   发布时间: 2011-09-15