章节
问答
笔记
评论
占位
占位

$.Deferred的设计

由于1.7版本后$.Callbacks从Deferred中抽离出去了,目前版本的Deferred.js代码不过150行,而真正$.Deferred的实现只有100行左右,实现的逻辑是相当犀利的。

因为Callback被剥离出去后,整个Deferred就显得非常的精简,代码直接通过extend扩展到静态接口上,对于extend的继承这个东东,在之前就提及过jQuery如何处理内部jQuery与init相互引用this的问题,所以当jQuery.extend只有一个参数的时候,其实就是对jQuery静态方法的一个扩展。

jQuery.extend({
   Deferred:function(func){
        ...省略代码....
        return deferred
   },
   when:function(func){
      ...省略代码....
      return deferred.promise();
   }
})

我们来具体看看2个静态方法内部都干了些什么?

Deferred整体结构:右边代码所示。

Deferred就是一个简单的工厂方法,有两种方式使用:

var a = $.Deferred()
$.Deferred(function(){})

内部其实是严重依赖$.Callbacks对象,Callbacks就是用来储存deferred依赖的数据的。

因为done、fail、progress就是jQuery.Callbacks("once memory")所有对应的处理:

var list = jQuery.Callbacks("once memory")
promise['done'] = list.add;

deferred定义了一系列的接口,堪称一绝,100多行的代码,精练的有些过分。

Deferred方法内部建议了2个对象,一个是deferred外部接口对象,一个是内部promise对象。

promise对象解释是一个受限的对象, 这就是所谓的受限制的deferred对象,因为相比之前, 返回的deferred不再拥有resolve(With), reject(With), notify(With)这些能改变deferred对象状态并且执行callbacklist的方法了,只能是then、done、fali等方法。

其内部通过tuples数组,存储了所有的接口API,通过遍历把所有的接口一次都挂到内部promise与deferred对象上。

其中定义了done、fail以及progress这几个方法,其实就是Callbacks回调函数中的add方法,用与push外部的的数据,保存在队列上。

我们通过resolve、reject以及notify其实也就是处理Callbacks中的队列列表。

任务

?不会了怎么办
||

提问题

写笔记

截图
提交
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

举报

0/150
提交
取消
全部 精华 我要发布
全部 我要发布
最新 点赞
只看我的

手记推荐

更多

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?