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 相关文章推荐
JQuery 选项卡效果(JS与HTML的分离)
Apr 01 Javascript
js querySelector和getElementById通过id获取元素的区别
Apr 20 Javascript
js实现简单计算器
Nov 22 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 Javascript
PassWord输入框代码分享
Jun 07 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
Jan 03 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
Jan 16 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
vue axios封装及API统一管理的方法
Apr 18 Javascript
基于Vue实现平滑过渡的拖拽排序功能
Jun 12 Javascript
JavaScript判断浏览器运行环境的详细方法
Jun 30 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
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
python的Jenkins接口调用方式
2020/05/12 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
销售人员求职的自我评价分享
2014/03/15 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
公司财务管理制度
2015/08/04 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技