jQuery.Deferred对象

一、什么是deferred对象?

开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的。
通常的做法是,为它们指定回调函数(callback)。即事先规定,一旦它们运行结束,应该调用哪些函数。
但是,在回调函数方面,jQuery的功能非常弱。为了改变这一点,jQuery开发团队就设计了deferred对象。

1、生成Deferred对象

2、deferred对象状态 以及 改变状态

  • pending: 表示还没有完成
  • resolved: 表示操作成功
  • rejected: 表示操作失败

可以通过state方法来获取状态

3、绑定回调方法

resolve方法对应着done方法,reject方法对于着fail方法。

4、then方法

then方法的作用也是设置回调方法。他可以接受三个参数。按顺序为 done, fail, progress 这3个方法。
自jQuery1.8后,then方法有一个返回值就是promise对象。而done()返回的是原有的deferred对象。如果then()指定的回调函数有返回值,该返回值会作为参数,传入后面的回调函数。

5、pipe方法

大致的作用是将resolve、reject、notify传入的参数再做一下处理。

6、promise对象

简单说,promise对象就是不能改变状态的deferred对象,也就是deferred的只读版。或者更通俗地理解成,promise是一个对将要完成的任务的承诺,排除了其他人破坏这个承诺的可能性,只能等待承诺方给出结果。

你可以通过promise对象,为原始的deferred对象添加回调函数,查询它的状态,但是无法改变它的状态,也就是说promise对象不允许你调用resolve和reject方法。

7、$.when方法

$.when()接受多个deferred对象作为参数,当它们全部运行成功后,才调用resolved状态的回调函数,但只要其中有一个失败,就调用rejected状态的回调函数。它相当于将多个非同步操作,合并成一个。实质上,when方法为多个deferred对象,返回一个单一的promise对象。

参考链接:
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
http://www.web-tinker.com/article/20154.html
http://javascript.ruanyifeng.com/jquery/deferred.html