它解决了如何处理耗时操作的问题,提供了更好的控制和javascript统一的编程接口。
deferred对象允许为多个事件指定一个回调函数。
deferred对象把一套回调函数接口,从ajax操作扩展到所有操作。
wait()函数返回的是deferred对象,可以加上链式操作。
wait()函数执行完毕,就会自动运行done()方法指定的回调函数。
deferred对象有三种执行状态——未完成,已完成和已失败。
上面的dtd是一个全局对象,它的执行状态可以从外部改变。
在代码尾部加一行dtd.resolve(),改变dtd对象的执行状态,导致done()方法立即执行。
为了避免这种情况,jQuery提供了deferred.promise()方法。作用是在原来的deferred对象上返回另一个deferred对象,后者只开放与改变状态无关的方法(done()和fail()),屏蔽与改变状态有关的方法(resolve()和reject()),从而使得执行状态不能被改变。
另一种防止执行状态被外部改变的方法,使用deferred对象的构建函数$.Deferred()。
$.Deferred()可以接受一个函数名作为参数,$.Deferred()所生成的deferred对象将作为这个函数的默认参数。
除了上面两种方法之外,还可以直接在wait()对象上部署deferred接口。
如果then()有两个参数,那么第一个参数是done()方法的回调函数,第二个参数是fail()方法的回调方法。如果then()只有一个参数,那么等同于done()。
用来指定回调函数,作用是不管调用的是deferred.resolve()还是deferred.reject(),最后总是执行。