jQuery源码学习13——Ajax

Ajax部分的核心是ajax静态方法

jQuery初始化的时候提供了ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess一系列实例化方法

在ajax内部会依次触发这些方法

if ( ! jQuery.active++ )
  jQuery.event.trigger( "ajaxStart" );

关于ajaxStart方法,当页面中只发送一个请求时,请求一开始时,进入ajax方法判断jQuery.active的值

此时jQuery.active的值是0,jQuery.active++的值也是0,再取反,满足条件,触发ajaxStart方法

onreadystatechange里面不管是响应成功或者超时都会再次判断jQuery.active的值

if ( ! --jQuery.active )
  jQuery.event.trigger( "ajaxStop" );

--jQuery.active的值就成了0,触发ajaxStop事件

以上是只发送一个请求的情况

如果一次性发送了很多请求的话

$.ajaxTimeout(30000);//设置超时时间为30s
$.ajax({
    "type":"get",
    "data":{
        "aaa":111,
        "bbb":222
    },
    "url":"firstRequest.php"
});
$.ajax({
    "type":"get",
    "data":{
        "aaa":111,
        "bbb":222
    },
    "url":"secondRequest.php"
});
$.ajax({
    "type":"get",
    "data":{
        "aaa":111,
        "bbb":222
    },
    "url":"thirdRequest.php"
});

第一个请求调用ajax的时候jQuery.active的值是0,jQuery.active++表达式仍然是0,取反为真,触发ajaxStart

接下来第二个请求马上又会调用ajax,按照一般的网络情况来说,这时第一个请求一定没有响应,按照js执行代码的速度来说,一定没有超过超时时间30s

这样一来就没有机会修改jQuery.active的值,此时jQuery.active的值是1,jQuery.active++仍然是1,取反为假,不会触发ajaxStart

同理,第三个也不一定触发ajaxStart,所以jQuery.active的值为2,jQuery.active++仍然是2,取反为假,不会触发ajaxStart

综合以上结果,可以得出结论:当一次性发送多个请求的时候只有第一个请求开始发送时触发ajaxStart事件

不论哪个请求回来,以何种方式(成功或失败)回来都会触发ajaxComplete事件

当所有的请求都回来的时候触发ajaxStop事件

ajaxSuccess和ajaxError的触发时机自然不必多说

此外,之所以给onreadystatechange绑定了一个有名字的函数

xml.onreadystatechange = onreadystatechange;

是因为其他地方还调用了onreadystatechange这个函数

什么地方调用呢?

就是我们加了超时时间的时候调用的

if(jQuery.timeout > 0)
    setTimeout(function(){
        // Check to see if the request is still happening
        if (xml) {
            // Cancel the request
            xml.abort();

            if ( !requestDone ) onreadystatechange( "timeout" );

            // Clear from memory
            xml = null;
        }
    }, jQuery.timeout);

当到达超时时间后会触发setTimeout里面的函数

首先判断有没有xml对象是否存在

有xml对象的话证明xml.readyState还没有到4,所以进入onreadystatechange函数之后第一个if条件都不符合

那此时的requestDone一定也是false

所以执行setTimeout里面的函数时会执行onreadystatechange( "timeout" )

ajax失败,触发参数中传入的error函数

反之触发success函数,并把xml对象传递回去

不管成功失败,都会执行complete函数

至此,v1.0.0的代码看得差不多了

posted on 2015-12-03 14:22  特拉法尔加  阅读(204)  评论(0编辑  收藏  举报