在 JavaScript Promise 中,Deferred 是一个很重要的概念。本文将会对 Deferred 进行详细的解释,并给出代码示例作为参考。
什么是 Deferred
Deferred 是 Promise 的一个扩展接口,可以理解为对 Promise 的封装。在 Promise 中,一个 Promise 要么处于 Pending(等待)状态、Fulfilled(已完成)状态或者 Rejected(已失败)状态。而 Deferred 就是提供了一种途径来主动改变 Promise 的状态。
我们可以使用 Deferred 来表示一个尚未完成的异步操作,并在异步操作完成后主动改变 Promise 的状态。这样,我们就可以直接通过 Promise 的 then 方法等待异步操作的结果。
Deferred 的用法
在 jQuery Deferred 中,使用 Deferred 构造函数来创建 Deferred 对象。可以通过 Deferred 对象的 resolve 和 reject 方法来主动改变 Promise 的状态,resolve 方法将 Promise 状态改变为 Fulfilled,而 reject 方法将 Promise 状态改变为 Rejected。
以下是 Deferred 的基本使用示例:
var dfd = $.Deferred(); // 创建 Deferred 对象 setTimeout(function() { dfd.resolve("Deferred Value"); // 改变 Promise 的状态为 Fulfilled }, 5000); dfd.promise().then(function(result) { console.log(result); // 输出 Deferred Value });
Deferred 应用示例
以下是一个 Deferred 应用的示例,用于获取用户输入的地址,并将地址转换为经纬度坐标。
-- -------------------- ---- ------- --- ---------- - ---------- - --- --- - ------------- --- ------- - ----------------- -- ---------- - -------------------- - ---- - -- ------ --- ----------- --- -------- - --- ---------------- -------------------------- --------------- - -- ------- - ------------------- - ---- - --------------------- - --- - ------ -------------- -- --------------------------------- - --------------------- - --- - ----------- -- ------- -- --------------- - ------------------- -- ------ ---
在这个示例中,我们首先创建了一个 getAddress 函数,用于获取用户输入的地址。当用户输入地址后,我们使用百度地图 API 将地址转换为经纬度坐标,并将转换后的坐标通过 Deferred 的 resolve 方法,将 Promise 的状态改变为 Fulfilled。如果地址解析失败,则使用 Deferred 的 reject 方法,将 Promise 的状态改变为 Rejected。
接着,我们通过调用 getAddress 函数返回的 Promise 对象的 then 方法来获取经纬度坐标,并打印输出。
总结
Deferred 是 Promise 的一个扩展接口,可用于主动改变 Promise 的状态。在应用中,我们可以使用 Deferred 来表示一个尚未完成的异步操作,并在异步操作完成后,使用 resolve 或 reject 方法来改变 Promise 的状态,最终通过 Promise 的 then 方法等待异步操作的结果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f579baf6b2d6eab3e32c38