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 状态,它将保持该状态。仍然可以将回调添加到已解析或已拒绝的 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 被解析或拒绝,它就保持在该状态;例如,对 deferred.resolve() 的第二次调用将被忽略。例如,如果在 Deferred 被解析后通过 deferred.then() 添加了更多函数,它们会立即使用之前提供的参数被调用。

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