jquery源码学习笔记(十七)

幸运
185
文章
0
评论
三月 14, 202014:02:50 评论 123 2740字阅读9分8秒

之前的几次,我们详细的琢磨了一下延迟对象 Deferred,今天我们接着来看源码,分析一下 when 方法,when 是延迟对象的辅助方法。

在看源码之前,我们先来简单写一个小例子用一下 when 方法。

// when 方法是 jQuery 的扩展方法// 因此使用的时候,是 $.when() 或 jQuery.when()$.when().done(function(){    console.log("ok!"); // 控制台输出 ok!})

    上述代码可以看出,when 方法 可以调用 done,那么如果不出意外的话,when 方法的返回值就是 deferred 对象或 promise 对象。

接下来我们再来看一个小例子:

function defFn1(){  var def = $.Deferred();  def.resolve();  return def;}function defFn2(){  var def = $.Deferred();  def.resolve();  return def;}
// 只有 when 中的传递的延迟对象都执行了 resolve,才会执行done$.when(defFn1(), defFn2()).done(function(){  console.log("成功!");})

    通过上述小例子可以看出,when 方法是用来处理多延迟对象的情况。上面是延迟对象成功的例子,接下来,我们再来写一个延迟对象失败的例子。

function defFn1(){  var def = $.Deferred();  def.reject();  return def;}function defFn2(){  var def = $.Deferred();  def.reject();  return def;}
// 失败的情况和成功的情况不太一样// when 中传递延迟对象参数  // 只要有一个执行了 reject,就会执行 fail$.when(defFn1(), defFn2()).fail(function(){  console.log("成功!");})

接下来,我们来一起看看 when 的源码。

jQuery.extend( {  // when方法是延迟对象的辅助方法  when: function( singleValue ) {    var      // 记录未完成的个数,当完成后就会执行 --      //  当 remaining为 0时      //     全部延迟对象都完成了 或是 没有传参      remaining = arguments.length,      // 未处理参数的计数      i = remaining,      // resolveContexts 声明了一个数组      resolveContexts = Array( i ),      // 将 arguments 转成 数组 resolveValues      resolveValues = slice.call( arguments ),      // master 就是一个延迟对象      // 可以使用延迟对象上的所有方法      master = jQuery.Deferred(),
      updateFunc = function( i ) {        return function( value ) {          resolveContexts[ i ] = this;          resolveValues[ i ] = arguments.length > 1                               ? slice.call( arguments ) : value;          // 当 remaining 为 0时,          //    说明都是成功的,触发master的resolve          if ( !( --remaining ) ) {            master.resolveWith( resolveContexts, resolveValues );          }        };      };
    // 传递了一个参数或没有传参    if ( remaining <= 1 ) {      // 第一种情况 没有参数        // 由于 singleValue 为空,所以直接执行 resolve      // 第二种情况 有一个参数        // 无论成功还是失败,都可以去触发 master上的方法      adoptValue(           singleValue,           master.done( updateFunc( i ) ).resolve,           master.reject,          !remaining );
      // 当 传递了一个参数,且是 延迟对象时,执行 then 方法      if ( master.state() === "pending" ||        isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {        return master.then();      }    }        // 多个参数,依次执行    //  updateFunc( i ) 当全部成功,才会执行成功    //  但凡有一个失败,就去执行 master.reject    while ( i-- ) {      adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );    }    // 最后的返回值是 promise    return master.promise();  }} );
// 错误处理,有错误的情况,执行 rejectfunction adoptValue( value, resolve, reject, noValue ) {  var method;  try {    if ( value && isFunction( ( method = value.promise ) ) ) {      method.call( value ).done( resolve ).fail( reject );    } else if ( value && isFunction( ( method = value.then ) ) ) {      method.call( value, resolve, reject );    } else {      resolve.apply( undefined, [ value ].slice( noValue ) );    }  } catch ( value ) {    reject.apply( undefined, [ value ] );  }}

    到此为止,延迟对象就分析的差不多了,感觉收获还是挺多的,下次,我们将开始分析 ready 方法。

本文来源于:jquery源码学习笔记(十七)-幸运草博客
特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。

  • 本站QQ群
  • weinxin
  • 捐赠本站
  • weinxin
jquery中cookie用法介绍 jQuery

jquery中cookie用法介绍

cookie在jquery中有指定的cookie操作类,下面我先来介绍我们在使用cookie操作类时的一些问题,然后介绍正确的使用方法。 使用JQuery操作cookie时 发生取的值不正确的问题: ...
jQuery事件:bind、delegate、on的区别 jQuery

jQuery事件:bind、delegate、on的区别

「内容简介」本文详解各种jQuery事件绑定方法:on,bind,delegate,live,unbind,trigger。 同时总结一下常用的jQuery事件技术:如何阻止事件冒泡、阻止浏览器默认行...
jQuery入门讲解-jQuery样式操作 jQuery

jQuery入门讲解-jQuery样式操作

css 操作 通过css()的方法设置或者获取样式,无论样式属性是从外部导入的,还是直接写在HTML标签里面的,css()方法都可以获取到。。 1、设置单个样式: 2、设置多个样式: 操作多个样式的时...
Jquery Notes jQuery

Jquery Notes

1.什么是jQuery 2.如何使用jQuery 3.查找元素 1.什么是jQuery jQuery是第三方开发的执行DOM操作的极简化的函数库 第三方:下载 执行DOM操作:jQuery还是执行DO...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: