jQuery中的deferred使用方法

发布时间 - 2026-01-11 00:22:45    点击率:

deferred简介

deferred对象是jQuery的回调函数解决方案,jQuery之前的版本中异步回调这块做的不是很好,所以后期补上了该解决方案。

普遍的ajax操作方式

我们先来回顾一下jQuery中普通的ajax操作

$.ajax({
 url: 'test.html',
 success: function (res) {
 console.log('数据读取成功');
 },
 error: function () {
 console.log('数据读取失败');
 }
});

1.5版本后的新写法如下:

$.ajax('test.html').done(function (res) {
 console.log('数据读取成功');
}).fail(function () {
 console.log('数据读取失败');
});

新版本的写法相比老版本有一个优势,就是可以自由添加多个回调函数并且按照添加顺序执行:

$.ajax('test.html').done(function (res) {
 console.log('数据读取成功');
}).fail(function () {
 console.log('数据读取失败');
}).done(function (res) {
 console.log('这是第二个成功的回调函数');
});

为多个ajax指定回调函数

我们可以通过when方法,为多个事件指定一个回调函数

$.when($.ajax('test.html'), $.ajax('test2.html')).done(function (res) {
 console.log('数据读取成功');
}).fail(function () {
 console.log('数据读取失败');
});

为普通函数指定回调函数

前面说到的when是用于ajax方法,而ajax其实是deferred对象,如果不是ajax对象,换成普通的函数呢,直接使用when是不会有效果的,会直接执行done方法

所以我们需要手动新建一个deferred对象

var defer = $.deferred(); //新建一个deferred对象
var wait = function (defer) {
 var tasks = function () {
  console.log('执行完毕!');
  defer.resolve(); //改变deferred对象的执行状态 - 成功
 };
 setTimeout(tasks, 5000);
 return defer;
};

这里的resolve就是触发done的,对应的reject方法则是用来调用fail方法的。

var defer = $.deferred(); //新建一个deferred对象
var wait = function (defer) {
 var tasks = function () {
  console.log('执行完毕!');
  defer. reject(); //改变deferred对象的执行状态 - 失败
 };
 setTimeout(tasks, 5000);
 return defer;
};

执行方法

$.when(wait(defer)).done(function (res) {
 console.log('数据读取成功');
}).fail(function () {
 console.log('数据读取失败');
});

进一步优化

上面的代码还有一些问题,defer是暴露在全局的,所以我们是可以通过在全局进行defer.resolve()来提前回调。

为了避免这种情况,jQuery提供了deferred.promise()方法,它的作用是在原来的deferred对象上返回另一个deferred对象,后者只开放与改变执行状态无关的方法(比如done方法和fail方法)屏蔽与改变执行状态有关的方法(比如resolve和reject方法)。

var defer = $.deferred(); //新建一个deferred对象
var wait = function (defer) {
 var tasks = function () {
  console.log('执行完毕!');
  defer.resolve(); //改变deferred对象的执行状态 - 成功
 };
 setTimeout(tasks, 5000);
 return defer.promise();
};
$.when(wait(defer)).done(function (res) {
 console.log('数据读取成功');
}).fail(function () {
 console.log('数据读取失败');
});

也可以把defer包在函数中

// 普通方法
var wait = function () {
 var defer = $.deferred(); //新建一个deferred对象
 var tasks = function () {
  console.log('执行完毕!');
  defer.resolve(); //改变deferred对象的执行状态 - 成功
 };
 setTimeout(tasks, 5000);
 return defer.promise();
};
$.when(wait()).done(function (res) {
 console.log('数据读取成功');
}).fail(function () {
 console.log('数据读取失败');
});
// 执行异步
var setAjax = function () {
 var defer = $.Deferred();
 if (xhr) {
  xhr.abort();
  xhr = null;
 }
 var xhr = $.ajax({
  url: 'test.html',
  success: function (res) {
   console.log('数据读取成功');
   defer.resolve(res);
  },
  error: function () {
   console.log('数据读取失败');
   defer.reject();
  }
 });
 return defer.promise();
}
$.when(setAjax()).then(function (res) {
 console.log('数据读取成功', res);
}, function () {
 console.log('数据读取失败');
});

以上所述是小编给大家介绍的jQuery中的derferred使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# jquery  # deferred  # jQuery使用deferreds串行多个ajax请求  # jQuery中deferred对象使用方法详解  # jQuery.deferred对象使用详解  # jquery基础教程之deferred对象使用方法  # jQuery源码分析-05异步队列 Deferred 使用介绍  # jQuery的deferred对象使用详解  # 在jQuery1.5中使用deferred对象 着放大镜看Promise  # 在jQuery 1.5中使用deferred对象的代码(翻译)  # 回调  # 新建一个  # 多个  # 法相  # 小编  # 这是  # 是在  # 很好  # 在此  # 上了  # 则是  # 说到  # 我们可以  # 可以通过  # 第二个  # 给大家  # 这种情况  # 如果不是  # 这块  # 还有一些 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  Laravel如何优化应用性能?(缓存和优化命令)  ,网页ppt怎么弄成自己的ppt?  如何获取PHP WAP自助建站系统源码?  Laravel如何实现数据库事务?(DB Facade示例)  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何在阿里云域名上完成建站全流程?  高防服务器租用如何选择配置与防御等级?  Linux系统运维自动化项目教程_Ansible批量管理实战  如何用美橙互联一键搭建多站合一网站?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何用PHP快速搭建CMS系统?  Laravel如何使用查询构建器?(Query Builder高级用法)  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel怎么实现验证码(Captcha)功能  如何用免费手机建站系统零基础打造专业网站?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  晋江文学城电脑版官网 晋江文学城网页版直接进入  Android 常见的图片加载框架详细介绍  简历在线制作网站免费版,如何创建个人简历?  Laravel如何使用模型观察者?(Observer代码示例)  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在云虚拟主机上快速搭建个人网站?  如何在建站宝盒中设置产品搜索功能?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  详解vue.js组件化开发实践  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  音响网站制作视频教程,隆霸音响官方网站?  Laravel如何使用Sanctum进行API认证?(SPA实战)  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何挑选高效建站主机与优质域名?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在IIS服务器上快速部署高效网站?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  简单实现Android文件上传  如何用好域名打造高点击率的自主建站?  郑州企业网站制作公司,郑州招聘网站有哪些?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】