zoukankan      html  css  js  c++  java
  • 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的代码看得差不多了

  • 相关阅读:
    过去式和过去进行式
    现在式和现在进行式
    英文文法的最基本规则
    Vue 标签中的ref属性和refs
    APICloud
    小程序
    React 传值 组件传值 之间的关系
    css clip样式 属性功能及作用
    小程序点击预览 为什么显示空白
    小程序
  • 原文地址:https://www.cnblogs.com/zhaohuiziwo901/p/5013851.html
Copyright © 2011-2022 走看看