jQuery中的Deferred和promise 的区别


Posted in Javascript onApril 03, 2016

Deferred和Promise之间有什么区别呢?

promise

一个promise就是一个由 异步函数返回的对象 。当你想要自己编写一个这样的函数时你需要使用一个deferred。

var promise = $.ajax({
url: "/myServerScript"
});
promise.done(mySuccessFunction); 
promise.fail(myErrorFunction); 
var promise = $.ajax({
url: "/myServerScript"
}); 
promise.then(mySuccessFunction,myErrorFunction);

使用Promises的好处有以下几点:

你可以多次调用done()和fail()函数,并使用不同的回调函数。或许你的一个回调函数用来停止动画,一个用来发起一个新的AJAX请求,一个用来将接受到的数据展示给用户。

var promise = $.ajax({ url: "/myServerScript" });
promise.done(myStopAnimationFunction); promise.done(myOtherAjaxFunction); 
promise.done(myShowInfoFunction); promise.fail(myErrorFunction);

即使在AJAX调用完成之后,你依然可以调用done()和fail()函数,并且回调函数可以立即执行。不同的状态之间并不会发生变量混乱。当一个AJAX调用结束时,它保持了一个成功状态或者失败状态,这个状态不会发生改变。

你可以合并promises。有时你需要同时进行两个AJAX请求并且想要在两个AJAX请求都成功时调用一个函数。为了完成这个任务,你需要使用一个新的$.when()函数:

var promise1 = $.ajax("/myServerScript1"); 
var promise2 = $.ajax("/myServerScript2");
$.when(promise1, promise2).done(function(xhrObject1, xhrObject2) { // 处理两个XHR对象 });

deferred

简单说,deferred对象就是jQuery的回调函数解决方案。在英语中,defer的意思是”延迟”,所以deferred对象的含义就是”延迟”到未来某个点再执行。

一个 deferred对象 能做的和一个promise对象差不多,但是它有两个函数来触发 done()和fail()函数 。

一个deferred对象拥有一个resolve()函数来处理一个成功的结果并执行与done()相关的函数。reject()函数则用来处理失败的结果并执行与fail()相关的函数。

你可以给resolve()和reject()函数都提供参数,然后它们都将传递给与done()和fail()相关的回调函数。

总结

jQuery 的ajax 就是返回一个promise 对象,里面含有done(), fail()方法; deferred 就是实现返回这个promise 对象的过程。

Javascript 相关文章推荐
弹出广告特效(一个IP只弹出一次)的代码
Jul 27 Javascript
理解Javascript_14_函数形式参数与arguments
Oct 20 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
Jul 25 Javascript
jquery选择符快速提取web表单数据示例
Mar 27 Javascript
当某个文本框成为焦点时即清除文本框内容
Apr 28 Javascript
JS实现跟随鼠标闪烁转动色块的方法
Feb 26 Javascript
AngularJS动态生成div的ID源码解析
Aug 29 Javascript
jQuery实现鼠标跟随效果
Feb 20 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
node.js到底要不要加分号浅析
Jul 11 Javascript
使用异步组件优化Vue应用程序的性能
Apr 28 Javascript
vue-router源码之history类的浅析
May 21 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
Apr 03 #Javascript
jQuery qrcode生成二维码的方法
Apr 03 #Javascript
Node.js 应用跑得更快 10 个技巧
Apr 03 #Javascript
AngularJs 60分钟入门基础教程
Apr 03 #Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
Apr 03 #Javascript
基于JavaScript实现 网页切出 网站title变化代码
Apr 03 #Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
Apr 03 #Javascript
You might like
Adodb的十个实例(清晰版)
2006/12/31 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
PHP7多线程搭建教程
2017/04/21 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
js 省地市级联选择
2010/02/07 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
对于Python装饰器使用的一些建议
2015/06/03 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
Python pymsql模块的使用
2020/09/07 Python
用Python写一个for循环的例子
2016/07/19 面试题
工程造价自荐信
2013/10/09 职场文书
业务助理岗位职责
2013/11/18 职场文书
工地门卫岗位职责
2013/12/30 职场文书
市政管理求职信范文
2014/05/07 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python