jQuery.Deferred()


jQuery.Deferred( [beforeStart ] )返回: Deferred

描述: 一个工厂函数,返回一个可链式调用的实用程序对象,该对象具有将多个回调注册到回调队列、调用回调队列以及传递任何同步或异步函数的成功或失败状态的方法。

jQuery.Deferred() 工厂会创建一个新的 deferred 对象。

jQuery.Deferred 方法可以传入一个可选函数,该函数在方法返回之前被调用,并将新的 deferred 对象作为 this 对象和函数的第一个参数传入。被调用的函数可以使用 deferred.then() 等方法附加回调。

一个 Deferred 对象开始于 pending 状态。使用 deferred.then()deferred.always()deferred.done()deferred.fail() 添加到对象的任何回调都会排队等待稍后执行。调用 deferred.resolve()deferred.resolveWith() 会将 Deferred 转换为 resolved 状态,并立即执行所有已设置的 doneCallbacks。调用 deferred.reject()deferred.rejectWith() 会将 Deferred 转换为 rejected 状态,并立即执行所有已设置的 failCallbacks。一旦对象进入 resolved 或 rejected 状态,它就会保持在该状态。回调仍然可以添加到 resolved 或 rejected 的 Deferred 中——它们会立即执行。

使用 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 被 resolved 或 rejected,它就会保持在该状态;例如,第二次调用 deferred.resolve() 将被忽略。如果 Deferred 被 resolved 后通过 deferred.then() 添加更多函数,它们将立即使用先前提供的参数被调用。

在大多数情况下,当 jQuery API 调用返回 Deferred 或 Promise 兼容对象(例如 jQuery.ajax()jQuery.when())时,您只需要使用 deferred.then()deferred.done()deferred.fail() 方法将回调添加到 Deferred 的队列中。API 调用或创建 Deferred 的代码的内部实现将在某个时刻调用 deferred 上的 deferred.resolve()deferred.reject(),导致相应的回调运行。