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 相关文章推荐
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
解决JQuery全选/反选第二次失效的问题
Oct 11 jQuery
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
基于jQuery解决ios10以上版本缩放问题
Nov 03 jQuery
jquery实现楼层滚动效果
Jan 01 jQuery
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
jQuery实现的别踩白块小游戏完整示例
Jan 07 jQuery
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 jQuery
jquery操作select常见方法大全【7种情况】
May 28 jQuery
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
JQuery实现折叠式菜单的详细代码
Jun 03 jQuery
jquery实现穿梭框功能
Jan 19 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 strncasecmp字符串比较的小技巧
2011/01/04 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
Python复数属性和方法运算操作示例
2017/07/21 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
Django自定义manage命令实例代码
2018/02/11 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
Python reques接口测试框架实现代码
2020/07/28 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
科研先进个人典型材料
2014/01/31 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
何玥事迹观后感
2015/06/16 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书