jQuery.Deferred()
一个工厂函数,该函数返回一个可链接的实用程序对象,该对象具有将多个回调注册到回调队列,调用回调队列以及中继任何同步或异步函数的成功或失败状态的方法。
jQuery.Deferred([beforeStart])
- beforeStart。类型:Function(Deferred deferred)。在构造函数返回之前调用的函数。
该jQuery.Deferred()
工厂创建一个新的deferred
对象。
该jQuery.Deferred
方法可以被传递的可选功能,这仅仅是该方法返回之前调用,并传递新的deferred
对象作为this
对象并作为第一个参数函数。例如,被调用函数可以使用deferred.then()
绑定回调。
迟对象对象状态有三种。pending:表示延迟对象尚未解决状态;resolved:表示延迟对象在解决状态;: 表示延迟对象为拒绝状态;
- 延迟的对象以pending(尚未解决)状态开始。添加到与该对象的回调
deferred.then()
,deferred.always()
,deferred.done()
,或deferred.fail()
进行排队,稍后执行。 - 调用
deferred.resolve()
或deferred.resolveWith()
将Deferred(递延)转换为resolved(已解决)状态,然后立即执行所有doneCallbacks
已设置的状态。 - 调用
deferred.reject()
或deferred.rejectWith()
将Deferred(递延)转换为rejected(拒绝)状态,并立即执行failCallbacks
所设置的任何内容。 - 对象进入已解析或拒绝状态后,它将保持在该状态。回调仍可以添加到已解决或已拒绝的延迟中,它们将立即执行。
jQuery Deferred是增强的回调
在JavaScript中,通常会调用一些函数,这些函数可以选择接受该函数内调用的回调。例如,在jQuery 1.5之前的版本中,异步过程(例如jQuery.ajax()
接受回调)将在ajax请求成功、错误或完成后不久,被调用。
jQuery.Deferred()
对管理和调用回调的方式进行了一些增强。特别是,jQuery.Deferred()
提供了提供多个回调的灵活方法,并且无论原始回调调度是否已经发生,都可以调用这些回调。jQuery Deferred基于CommonJS Promises / A设计。
一种了解Deferred的模型是将其视为链感知功能包装器。在deferred.then()
,deferred.always()
,deferred.done()
,和deferred.fail()
方法,指定要调用的函数和deferred.resolve(args)
或deferred.reject(args)
方法“呼叫”与您提供的参数的功能。一旦解决了延期或拒绝延期,则保持该状态;例如deferred.resolve()
,对的第二次调用将被忽略。例如deferred.then()
,如果通过添加了更多函数,则在解析Deferred之后,将使用先前提供的参数立即调用它们。
在大多数情况下,jQuery的API调用返回递延或承诺兼容的对象如jQuery.ajax()
或jQuery.when()
,你只会想使用deferred.then()
,deferred.done()
和deferred.fail()
方法回调添加到递延的队列。创建Deferred的API调用或代码的内部将在某个时候调用deferred.resolve()
或deferred.reject()
推迟,从而导致适当的回调运行。