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插件HighCharts绘制简单2D折线图效果示例【附demo源码】
Mar 21 jQuery
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
Mar 23 jQuery
jquery中$.fn和图片滚动效果实现的必备知识总结
Apr 21 jQuery
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
May 13 jQuery
jQuery简介_动力节点Java学院整理
Jul 04 jQuery
jQuery插件DataTables分页开发心得体会
Aug 22 jQuery
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
Nov 14 jQuery
jQuery图片查看插件Magnify开发详解
Dec 25 jQuery
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
Feb 04 jQuery
jQuery 动态粒子效果示例代码
Jul 07 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
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
详解Vue方法与事件
2017/03/09 Javascript
js省市区级联查询(插件版&无插件版)
2017/03/21 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
Python字符遍历的艺术
2008/09/06 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
python实现猜数字小游戏
2020/03/24 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
Python如何读写二进制数组数据
2020/08/01 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
公司JAVA开发面试题
2015/04/02 面试题
介绍一下Mysql的存储引擎
2015/02/12 面试题
2015年安全员工作总结范文
2015/04/22 职场文书
现货白银电话营销话术
2015/05/29 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
Python基础之Socket通信原理
2021/04/22 Python
浅谈JS的二进制家族
2021/05/09 Javascript
分析并发编程之LongAdder原理
2021/06/29 Java/Android
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android