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 UI Grid 模态框中的表格实例代码
Apr 01 jQuery
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
jQuery实现的鼠标滚轮控制图片缩放功能实例
Oct 14 jQuery
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 jQuery
jQuery表单元素过滤选择器用法实例分析
Feb 20 jQuery
JS/jQuery实现超简单的Table表格添加,删除行功能示例
Jul 31 jQuery
jquery树形插件zTree高级使用详解
Aug 16 jQuery
jquery实现掷骰子小游戏
Oct 24 jQuery
jQuery实现可编辑的表格
Dec 11 jQuery
jquery向后台提交数组的代码分析
Feb 20 jQuery
jQuery实现查看图片功能
Dec 01 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 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
javascript截取字符串小结
2015/04/28 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
vue实现简单图片上传
2020/06/30 Javascript
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
python虚拟环境迁移方法
2019/01/03 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
关于python中的xpath解析定位
2020/03/06 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
监理资料员岗位职责
2014/01/03 职场文书
自主实习接收函
2014/01/13 职场文书
旷课检讨书1000字
2014/02/14 职场文书
娱乐节目策划方案
2014/06/10 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
七年级上册生物的课件
2019/08/07 职场文书
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL