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实现放大镜简洁代码(推荐)
Jun 08 jQuery
jquery与js实现全选功能的区别
Jun 11 jQuery
jQuery实现滚动到底部时自动加载更多的方法示例
Feb 18 jQuery
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
Jun 18 jQuery
使用异步controller与jQuery实现卷帘式分页
Jun 18 jQuery
jQuery 淡入/淡出效果函数用法分析
May 19 jQuery
jQuery实现简单飞机大战
Jul 05 jQuery
基于JQuery和DWR实现异步数据传递
Oct 16 jQuery
jQuery实现穿梭框效果
Jan 19 jQuery
jQuery实现广告显示和隐藏动画
Jul 04 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扩展函数
2006/10/09 PHP
web方式ftp
2006/10/09 PHP
关于Intype一些小问题的解决办法
2008/03/28 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
php递归函数怎么用才有效
2018/02/24 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
PHP7新特性简述
2017/06/11 Javascript
vue的事件绑定与方法详解
2017/08/16 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
详解Python中的文本处理
2015/04/11 Python
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
python和JavaScript哪个容易上手
2020/06/23 Python
python如何导入依赖包
2020/07/13 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
《桂林山水》教学反思
2014/02/08 职场文书
庆元旦活动总结
2014/07/09 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
Vue详细的入门笔记
2021/05/10 Vue.js
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android