4.Deferred

首先,Deferred是Promise的一种实现,并且,Deferred对象可以通过Callbacks实现,两者的使用方式也很像。

由于Promise有两种完成状态,一种resolve,一种reject,所以,对应的Callbacks就有两个,还有一个notify,似乎不是标准的Promise状态?

  • Deferred用到了Callbacks里面的memory参数,是因为Promise达到完成态后,再调用then方法时,应该按照之前的完成状态来进行触发
  • Deferred用到了Callbacks里面的once参数,是因为Promise达到完成态后,状态就不应该再改变了

有个问题是Deferred的状态是可以在外部改变的,调用$.Deferred()产生的对象cb上有cb.resolve()和cb.reject()方法(new Promise()创建的对象上没有),所以在Deferred中引入了promise()方法,目的就是使外部不能改变cb的状态,看这部分代码的时候被promise.then()函数和promise.promise( deferred );这句给误导了,其实具体的实现不在promise.then()里,而是在promise()方法里(回过头来看简直理所当然)。

promise()函数,如果不传参数,那么就返回promise对象,而promise对象里是没有deferred对象上的resolve、reject这些方法的

promise: function( obj ) {
    return obj != null ? jQuery.extend( obj, promise ) : promise;
}

Deferred函数里面有:

  1. 一个deferred对象,是返回的值,上面有resolve、reject、notify这些方法,自己没实现,是使用了Callbacks的实现
  2. 一个promise对象,上面有then、always、promise等方法,promise函数代码很少,但是它才是实现外部不能改变Deferred对象状态的关键,then函数的作用是done()和fail()可以一起写,就像ES6的Promise的then一样,always函数的作用是不论resolve还是reject,它指定的回调函数总是执行

$.when()是实现了ES6的Promise.all(),基本原理就是通过一个remain变量来存储还有多少的deferred没有执行的

================
2018-06-20

deferrred的then函数的作用是绑定resolve和reject后的回调,之前看的时候不注意,以为也就是一些和callbacks关联起来的操作而已,经过这篇文章(http://www.cnblogs.com/aaronjs/p/3356505.html)的提醒,发现then里面返回的是一个新的deferred,不过这篇文章里也没有解答为什么需要返回一个新的deferred(或许是我看的不仔细?),目前我也还没看懂,Deferred的函数体里还有一句和then相关的

if ( func ) {
    func.call( deferred, deferred );
}

看一下这篇也许能看懂https://www.cnblogs.com/yangjunhua/p/3509342.html,个人感觉也并不是逻辑有多深奥,而是有很多技巧和使用场景相关的内容,太纠结也不是很有必要

猜你喜欢

转载自blog.csdn.net/u011393161/article/details/80259600