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鼠标悬停内容动画切换效果
Apr 27 jQuery
jquery实现放大镜简洁代码(推荐)
Jun 08 jQuery
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
jqueryUI tab标签页代码分享
Oct 09 jQuery
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 jQuery
深入浅析angular和vue还有jquery的区别
Aug 13 jQuery
jQuery无冲突模式详解
Jan 17 jQuery
jQuery实现表格的增、删、改操作示例
Jan 27 jQuery
JavaScript实现的滚动公告特效【基于jQuery】
Jul 10 jQuery
jquery html添加元素/删除元素操作实例详解
May 20 jQuery
jQuery实现简单评论区功能
Oct 26 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
一个多文件上传的例子(原创)
2006/10/09 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
测试php函数的方法
2013/11/13 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
vue封装swiper代码实例解析
2019/10/08 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
Python装饰器使用示例及实际应用例子
2015/03/06 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
python常用函数与用法示例
2019/07/02 Python
python中web框架的自定义创建
2019/09/08 Python
Yahoo-PHP面试题4
2012/05/05 面试题
计算机专业推荐信范文
2013/11/27 职场文书
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL