javascript --- jQuery --- Deferred对象
javascript --- jQuery --- Deferred对象
javascript的函数式编程是多么引人入胜,
jQuery使代码尽可能的精简,intelligent!

defer - 必应词典:v.迁延;听从;扣存;【军】使延期入伍
所以deferred对象的含义就是"延迟"到未来某个点再执行。
jQuery的官方文档给出了用jQuery.ajax()发送请求的基本方式
http://api.jquery.com/jQuery.ajax/
Example: Save some data to the server and notify the user once it's complete.

服务端需要接收数据,这里为了方便起见,我们请求一个静态文件sample.html
sample.html的内容如下:
\jQuery_Deferred\sample.html
<!DOCTYPE html>
<html>
<body>
Ajax请求返回的数据!
</body>
</html>
这里的ajax方法请求的是静态文件sample.html
\jQuery_Deferred\deferred1.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Ajax Example</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
$.ajax({
type: "POST",
url: "sample.html",
data: { name: "John", location: "Boston" }
}).done(function (msg) {
alert("Data Saved: " + msg);
});
</script>
</body>
</html>
用浏览器打开后,可以看到如下的结果:picture

本文参考了阮一峰的日志:
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
deferred对象彻底改变了在jQuery中使用ajax
如果对ajax陌生,可以参考我以前写的日志:
http://www.cnblogs.com/kodoyang/p/Javascript_Ajax_XMLHttpRequest_Encapsulation.html
deferred对象就是jQuery的回调函数解决方案
下面是阮一峰博客的原文:
{
开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。
其中,既有异步的操作(比如ajax读取服务器数据),
也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的。
通常的做法是,为它们指定回调函数(callback)。
即事先规定,一旦它们运行结束,应该调用哪些函数。
它解决了如何处理耗时操作的问题,
对那些操作提供了更好的控制,以及统一的编程接口。
}
jQuery的ajax的传统写法如下:
jQuery的在线API 文档: http://jquery.cuishifeng.cn/
\jQuery_Deferred\deferred2.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Traditional Ajax</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
$.ajax({
url: "test.html",
context: document.body,
success: function () {
$(this).addClass("done");
}
});
</script>
</body>
</html>
\jQuery_Deferred\test.html
<p> success data! </p>
使用Deferred对象的链式操作,写法如下:
\jQuery_Deferred\deferred3.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Deferred Ajax</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
$.ajax("test1.html")
.done(function(data){
alert(data);
})
.fail(function(){
alert("error!");
});
</script>
</body>
</html>
这里$.ajax()返回的是deferred对象
deferred对象允许自由添加多个回调函数
\jQuery_Deferred\deferred4.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Deferred add callback function</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
$.ajax("test.html")
.done(function(data){
alert(data);
})
.fail(function(){
alert("error!");
})
.done(function(){
alert("haha, success!");
});
</script>
</body>
</html>
deferre对象允许为多个事件指定一个回调函数
当两个操作都返回成功时,运行done()指定的回调函数
\jQuery_Deferred\deferred5.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>above one request</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
$.when($.ajax("test.html"), $.ajax("sample.html"))
.done(function(){
alert("哈哈,成功了!");
})
.fail(function(){
alert("出错啦!");
});
</script>
</body>
</html>
使用普通操作的回调函数接口
\jQuery_Deferred\deferred6.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>general function</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
var wait = function(){
setTimeout(function(){
alert("执行完毕!");
}, 5000);
}
</script>
</body>
</html>
我们应该怎样为它指定回调函数?
$.ajax返回的是deferred对象,所以可以链式调用
具体的细节可以查看阮一峰的日志,我这里给出最后的写法:
\jQuery_Deferred\deferred7.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>final code</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
/**
* Deferred对象有三种执行状态:
* 未完成:
* 继续等待,或者调用progress()方法指定的回调函数
* 已完成:
* deferred.resolve() 调用后
* deferred对象立刻调用done()方法指定的回调函数
* 已失败:
* deferred.reject() 调用后
* 调用fail()方法指定的回调函数
*
* Deferred.promise函数:
* 避免Deferred对象的“执行状态”在外部发生改变
* 它的作用是,在原来的deferred对象上返回另一个deferred对象,
* 后者只开放与改变执行状态无关的方法(比如done()方法和fail()方法),
* 屏蔽与改变执行状态有关的方法(比如resolve()方法和reject()方法),
* 从而使得执行状态不能被改变。
*
* @returns 不能改变执行状态的Deferred对象
*/
function wait(){
// 在函数内部,新建一个Deferred对象
var deferred = $.Deferred();
setTimeout(function(){
alert("执行完毕!");
// 改变Deferred对象的执行状态
deferred.resolve();
}, 5000);
// 返回promise对象
return deferred.promise();
}
/**
* 接受一个Deferred对象,
* 当检测到对象的执行状态发生改变后,调用相应的函数
*/
$.when(wait())
.done(function(){
alert("hahah, 成功了!");
})
.fail(function(){
alert("aaouu,出错了!")
});
</script>
</body>
</html>
最后介绍一下Deferred.alway()函数
不管调用的是deferred.resolve()还是deferred.reject(),最后总是执行。
\jQuery_Deferred\deferred8.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>reject then always</title>
<script src="jquery-2.1.1.js"></script>
</head>
<body>
<script>
/**
* 这个方法也是用来指定回调函数的,它的作用是,
* 不管调用的是deferred.resolve()还是deferred.reject(),
* 最后总是执行。
*/
$.when($.ajax("test1.html"))
.always(function(data){
alert("已执行:" + data);
});
</script>
</body>
</html>
请关注我的日志:http://www.cnblogs.com/kodoyang/
For Better Programming!
javascript --- jQuery --- Deferred对象的更多相关文章
- jQuery.Deferred对象
一.前言 jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式: 1).串行调用Ajax $.ajax({ success: function() { $.ajax({ su ...
- JQuery Deferred 对象
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html <jQu ...
- 使用JQuery Deferred对象的then() 解决多个AJAX操作顺序依赖的问题
原文地址:http://www.2cto.com/kf/201507/424202.html 之前的文章javascript异步代码的回调地狱中提到了编写AJAX代码经常遇到的3个问题,现在我们看下如 ...
- jQuery Deferred对象详细源码分析(-)
本系列文章讲介绍这个Deferred东西到底拿来干什么,从1.5版本加进来,jQuery的很多代码都重写了.直接先上源码分析了,清楚了源码分析,下节将讲具体的应用 以及应用场景. 创建对象 var d ...
- JQuery Deferred 对象剖析
JQuery 中利用 Deferred 对象提供类似 ES2016(aka. es7) 中 Promise 的功能. JQuery 中的 AJAX 请求函数返回的就是 Deferred 对象. 通过使 ...
- javascript jquery封装对象时的错误,求解!我想知道为什么
jquery 封装对象时的错误 --------------------------------------------<input id="name" name=&qu ...
- JQuery Deferred对象使用小结
场景描述 如下,打开页面时,获取默认选中的项目,同时也会初始化Combobox下拉框下拉列表数据 问题描述 获取默认选中项目及下拉列表的js函数位于common.js文件,类似如下: // 根据项目类 ...
- javascript jquery 推断对象为空的方式
java中存在非常多空指针的问题,须要常常做预防和推断,如若不然,控制台出现恼人的异常,让人信心备受打击,早期敲代码的时候没有经验,不能依据异常信息找到问题的根源,唯一做的事情就是祈祷,千万别出现什么 ...
- 利用 Jquery Deferred 异步你的程序
最近在做公司QA系统改造时,有这样的一个场景. QA系统中有些数据项需要从JIRA平台(一个国外项目与事务跟踪工具)中获取,JIRA平台提供了很完善的Rest API. 现在的要求是,在QA系统中提交 ...
随机推荐
- Java Map各遍历方式的性能比较
1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...
- BackgroundWorker组件学习
今天看到别人的博客中提到了BackgroundWorker组件.在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看.今天凑巧看到了一个关于BackgroundWorker ...
- UITextField的总结
1.UITextField的初始化和设置 textField = [[UITextField alloc] initWithFrame:CGRectMake(120.0f, 80.0f, 150.0f ...
- node-odata: 基于 NodeJS 的 REST 框架
该开源项目目前已被 OData 官网 (odata.org)收录 关于 node-odata node-odata 可以让你轻松创建 REST API, 并能使用 OData 协议的格式进行数据的查询 ...
- Test Tools
1. http://www.dummytextgenerator.com/: Generate dummy text 2. fsutil file createnew D:\New.txt 1024: ...
- Android实现网络多线程文件下载
实现原理 (1)首先获得下载文件的长度,然后设置本地文件的长度. (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置. 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M ...
- 使用.9.png报错 Exception raised during rendering
Exception raised during rendering: Index: 2, Size: 2Exception details are logged in Window > Show ...
- Qt之QHeaderView自定义排序(QSortFilterProxyModel)
简述 对以上节的排序,我们衍伸了两点: 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较. 将整形显示为字符串,而排序依然正常呢. 为了分别描述,这里我们先解决问题1. 简述 效果 处理 ...
- SVG 动画实现弹性的页面元素效果
Codrops 分享了一些给SVG元素加上弹性动画的灵感.实现的思路是把一个SVG元素整合成一个组件,然后从一个路径弹性动画到另一个.这种效果可以应用到像菜单,按钮或其它元素,使得交互更有趣,看起更原 ...
- jquery radio 取值 取消选中 赋值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...