阅读jQuery--Deferred

来源:互联网 发布:苹果mac没有声音 编辑:程序博客网 时间:2024/04/30 06:42

其实在callbacks的基础上再来看deferred还是件挺容易的事情。不过deferred在设计上还是有值得可以学习的地方。下面就个人的理解解读一二:

整个deferred的最后是return deferred,deferred是由私有变量promise中的promise方法extend promise本身得到的一个对象。看上去有点绕了。。。其实promise(deferred的私有变量)就是deferred的核,他定义了deferred中

state():deferred状态

always():将一个方法同时添加到done和fail

then():将done,fail,progress(前三个参数按顺序)依次添加到一个新建的deferred中(执行的时候按照.then()的顺序执行resolve/reject/notify)。在源码中一旦调用了then,就会得到一个新的deferred,同时在旧的deferred中会使用done/fail/progress方法添加参数中传来的方法,旧的deferred一旦执行,则会执行刚才添加的方法,同时判断这个方法返回的对象是不是有promise属性(比如jquery的xhr),有的话则将返回的对象的resolve/reject/notify方法添加到新的deferred的done/fail/progress(这里可以避免在异步的时候先执行后面的方法);如果没有promise属性则resolve/reject/notify新的deferred。

promise():接受一个对象参数,并将此对象extend本deferred的promise对象返回给调用者(就是这里说的promise)。

done(),fail(),progress():添加执行方法。

pipe():等于then();

然后是promise对象没有方法:

resolve(),reject(),notify():执行通过done/fail/progress添加的方法。

deferred在new的时候也可以接受一个func当参数,此时这个func的上下文和第一个参数就是这个new 的deferred。