详解jQuery中的deferred对象的使用(一)


Posted in Javascript onMay 27, 2016

 deferred对象是jQuery对Promises接口的实现。它是非同步操作的通用接口,可以被看作是一个等待完成的任务,开发者通过一些通过的接口对其进行设置。事实上,它扮演代理人(proxy)的角色,将那些非同步操作包装成具有某些统一特性的对象,典型例子就是Ajax操作、网页动画、web worker等等。

jQuery的所有Ajax操作函数,默认返回的就是一个deferred对象。

在jquery1.5之后的版本中,加入了一个deferred对象,也就是延迟对象,用来处理未来某一时间点发生的回调函数。同时,还改写了ajax方法,现在的ajax方法返回的是一个deferred对象。

那就来看看deferred对象的用法。

1.ajax的链式回调

// ajax方法返回的是一个deferred对象,可以直接使用链式写法
$.ajax('test.json').done(function(resp){
// done 相当于success回调,其中默认的参数为success回调的参数
alert('success');
}).fail(function(){
// fail 相当于error回调
alert('error');
});

还可以同时写多个回调,会按照顺序依次执行

$.ajax('test.json').done(function(resp){
// done 相当于success回调,其中默认的参数为success回调的参数
alert('success');
}).done(function(){
// do something...
}).done(function(){
// do something...
});

deferred对象还有一个then方法,其实它是一个整合done和fail的方法,它接受一到两个参数,如果有两个参数,那么第一个就是done方法的回调函数,第二个是fail方法的回调函数。如果只有一个参数,那就是done方法的回调函数。

var success = function(){
alert('success'); 
};
var error = function(){
alert('error');
};
// 两个参数
$.ajax('test.json').then(success, error);
// 一个参数
$.ajax('test.json').then(success);

jQuery还提供了一个$.when(deferreds)的方法来执行一个或多个延迟对象的回调函数,当它的参数是延迟对象时,它会在所有延迟对象代表的异步执行完后再执行相应的回调函数

$.when($.ajax('test.json'), $.ajax('demo.json')) .done(function(){
alert('success'); 
}).fail(function(){
alert('error');
});

很好理解,只有当所有异步都成功时,才会执行done方法中的回调,否则会执行fail方法中的回调,同样好理解的是的done方法中回调函数的默认参数数量则和when方法参数数量相同。

而如果when方法中传入的只是普通对象,不是deferred对象时,会立即执行done方法中的回调,回调函数的默认参数为传入when方法的对象本身。

// 当传入when方法的参数只是普通对象时
$.when({test: 'test'}).done(function(resp){
console.log(resp.test); // 'test' 
}).fail(function(){
// 由于传入的对象不是deferred对象,那么就不会调用fail中的回调了 
})

当你需要两个甚至更多的异步结束后才调用回调函数,同时这些异步ajax可能还需要修改传输方式type或者传数据data时,代码就显得很乱,可读性很差。

所以就可以对ajax进行再次封装,提高代码可读性

var ajax = function(url, type, param){
return $.ajax({
url: url,
type: type,
data: param || {} 
}); 
};
ajax('test.json').done(function(resp){
alert('success');
}).fail(function(){
alert('error');
});

以上所述是小编给大家介绍的jQuery中的deferred对象的使用(一)的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery中ajax调用json数据的使用说明
Mar 17 Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 Javascript
js html5 css俄罗斯方块游戏再现
Oct 17 Javascript
Angular的自定义指令以及实例
Dec 26 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
Jan 03 Javascript
对称加密与非对称加密优缺点详解
Feb 06 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
Feb 12 Javascript
BootStrap实现带关闭按钮功能
Feb 15 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
js实现复制功能(多种方法集合)
Jan 06 Javascript
JavaScript复制内容到剪贴板的两种常用方法
Feb 27 Javascript
vue项目中使用bpmn-自定义platter的示例代码
May 11 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
May 27 #Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
May 26 #Javascript
Node.js的npm包管理器基础使用教程
May 26 #Javascript
JavaScript中的各种操作符使用总结
May 26 #Javascript
浅析JavaScript中的对象类型Object
May 26 #Javascript
简单总结JavaScript中的String字符串类型
May 26 #Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
May 26 #Javascript
You might like
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
写自已的js类库需要的核心代码
2012/07/16 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
python文件名和文件路径操作实例
2017/09/29 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
a标签下载链接的简单实现
2016/09/13 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
毕业生教师求职信
2013/10/20 职场文书
大学生军训广播稿
2014/01/24 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
仓管员岗位职责
2015/02/03 职场文书
财务部岗位职责
2015/02/03 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
写给女朋友的保证书
2015/05/09 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
MySQL学习必备条件查询数据
2022/03/25 MySQL