jQuery.Deferred() 是 jQuery 提供的一个用于处理异步操作的工具对象。它允许你注册多个回调函数,管理异步任务的成功(resolve)或失败(reject)状态,并支持链式调用。 以下是 var deferred = jQuery.Deferred(); 的几种典型使用示例,从基础用法到高级场景:
- 基础用法:手动控制异步状态 这是最直接的用法,创建一个 Deferred 对象,并在异步操作完成时手动改变其状态。
javascript
// 1. 创建 Deferred 对象
var deferred = jQuery.Deferred();
// 2. 绑定回调函数
// done: 当状态变为 resolved 时执行
deferred.done(function(value) {
console.log("成功: " + value);
});
// fail: 当状态变为 rejected 时执行
deferred.fail(function(reason) {
console.log("失败: " + reason);
});
// always: 无论成功还是失败都会执行
deferred.always(function() {
console.log("操作结束");
});
// 3. 模拟一个异步操作 (例如 setTimeout)
setTimeout(function() {
var isSuccess = true; // 模拟操作结果
if (isSuccess) {
// 改变状态为 resolved,触发 done 和 always
deferred.resolve("数据加载完成");
} else {
// 改变状态为 rejected,触发 fail 和 always
deferred.reject("网络错误");
}
}, 1000);
- 封装通用异步函数(推荐模式) 在实际开发中,通常不会在全局直接操作 Deferred 对象,而是将其封装在函数内部,并返回 Promise 对象。这样可以防止外部代码随意修改异步任务的状态(即防止外部调用 resolve 或 reject)。
javascript
function fetchData(url) {
// 创建 Deferred 对象
var deferred = jQuery.Deferred();
// 执行异步操作 (这里用 $.ajax 举例,其实 $.ajax 本身已返回 Promise)
// 假设这是一个自定义的异步逻辑
setTimeout(function() {
if (url) {
deferred.resolve({ data: "内容来自 " + url });
} else {
deferred.reject("URL 不能为空");
}
}, 500);
// 返回 promise 对象
// promise 对象只暴露 .done(), .fail(), .then() 等方法,
// 隐藏了 .resolve(), .reject() 等改变状态的方法
return deferred.promise();
}
// 使用封装好的函数
fetchData("api/test")
.done(function(result) {
console.log("获取成功:", result);
})
.fail(function(error) {
console.error("获取失败:", error);
});
- 使用 .when()并行处理多个异步任务Deferred对象可以与.when() 配合使用,等待多个异步操作全部完成后执行回调。
javascript
var d1 = jQuery.Deferred();
var d2 = jQuery.Deferred();
// 模拟两个独立的异步任务
setTimeout(function() { d1.resolve("任务1完成"); }, 1000);
setTimeout(function() { d2.resolve("任务2完成"); }, 2000);
// 等待所有任务完成
jQuery.when(d1, d2).done(function(val1, val2) {
console.log(val1); // "任务1完成"
console.log(val2); // "任务2完成"
console.log("所有任务已结束");
});
- 链式调用与状态传递 (then) then 方法不仅可以注册回调,还可以对返回值进行处理,并将结果传递给下一个回调。
javascript
var deferred = jQuery.Deferred();
deferred.then(
// 成功回调
function(value) {
console.log("第一步: " + value);
return value + " -> 处理后"; // 返回值会传递给下一个 then 或 done
},
// 失败回调
function(reason) {
console.log("出错: " + reason);
return jQuery.Deferred().reject("新错误信息"); // 可以返回一个新的 rejected promise
}
).done(function(finalValue) {
console.log("最终结果: " + finalValue);
});
// 触发 resolve
deferred.resolve("初始数据");
核心方法总结

注意事项
1.状态不可逆:一旦 Deferred 对象被 resolve 或 reject,其状态就固定了,再次调用 resolve 或 reject无效。
2.立即执行:如果在状态已经确定后(例如已经 resolve)再添加 done 回调,该回调会立即执行。
3.现代替代方案:虽然 jQuery Deferred 功能强大,但在现代 JavaScript 开发中,原生的 Promise 和 async/await 已成为标准。如果项目不依赖旧版 jQuery,建议优先使用原生 Promise。