Post

ajax为什么进error?

最近遇到ajax会进入到error分支的情况,但往往网上的方法并不能解决问题,不同的项目部署、不同的后台处理逻辑使得解决方法不尽相同。从ajax的原理开始一点点的分析是哪里出现了问题。

什么是AJAX?

AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

AJAX的原理

XMLHttpRequest对象是AJAX的核心,所有的浏览器(ie7以上、火狐、谷歌、)都支持该对象,XMLHttpRequest是js用于与后台服务器交互的对象。

查看error里的报错信息

想知道为什么进入error,首先需获取error分支的报错信息,按照以下方法打印出来

$.ajax({
        url:'/test',
        dataType:"json",
        type:"post",
        async:false,
        timeout:10000,
        beforeSend:function(){     
        },
        success:function(data){
            alert("success");
        },
        error:function(data,textStatus,errorThrown){
            alert('textStatus='+textStatus+',status='+data.status+',readyState='+data.readyState);
        },
        complete: function() {
        }
});

textStatus有几种值,”null”, “timeout”, “error”, “abort” 和 “parsererror”。发现打印出来的值是timeout,证明是请求超时。

超时

但是未到超时时间10000ms,为什么会超时?因为async为false时,浏览器已经被锁定,此时不会执行任何javascript,所以timeout不会起到任何作用。只有async是true时,timeout才会起作用。这时候就想到了可能是async的问题,一般来说尽量不要设置async为false,而将业务逻辑放入到success的callback中,这也是jquery1.8版本所倡导的方式。

总结

当后台执行ajax的时间过长,async为false时就会锁住页面,这时微信浏览器会进入到error中,报timeout的错误。解决方法是将async:false去掉,并在success的callback中处理对应业务逻辑。

Comments