jQuery中的deferred使用方法


Posted in jQuery onMarch 27, 2017

deferred简介

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

jQuery中的deferred使用方法

普遍的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 相关文章推荐
jquery插件制作 自增长输入框实现代码
Aug 17 jQuery
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
May 08 jQuery
使用 jQuery 实现表单验证功能
Jul 05 jQuery
使用jQuery实现动态添加小广告
Jul 11 jQuery
jQuery中each循环的跳出和结束实例
Aug 16 jQuery
基于jQuery解决ios10以上版本缩放问题
Nov 03 jQuery
jquery 输入框查找关键字并提亮颜色的实例代码
Jan 23 jQuery
Vue引入jquery实现平滑滚动到指定位置
May 09 jQuery
jquery引入外部CDN 加载失败则引入本地jq库
May 23 jQuery
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
jQuery.parseJSON()函数详解
Feb 28 jQuery
Jquery滑动门/tab切换实现方法完整示例
Jun 05 jQuery
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 #jQuery
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 #jQuery
jQuery实现鼠标经过显示动画边框特效
Mar 24 #jQuery
HTML5+jQuery实现搜索智能匹配功能
Mar 24 #jQuery
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 #jQuery
原生Aajax 和jQuery Ajax 写法个人总结
Mar 24 #jQuery
jQuery实现的背景颜色渐变动画效果示例
Mar 24 #jQuery
You might like
php 中文和编码判断代码
2010/05/16 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
Python多进程机制实例详解
2015/07/02 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
python实现感知机模型的示例
2020/09/30 Python
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
环境工程专业个人求职信
2013/12/05 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
班主任工作经验材料
2014/02/02 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
创先争优标语
2014/06/27 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
淮海战役观后感
2015/06/11 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL
python脚本框架webpy模板控制结构
2021/11/20 Python
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
Redis 异步机制
2022/05/15 Redis