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() 推迟,从而导致适当的回调运行。