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使用查询手册
Mar 07 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
Feb 10 Javascript
动态的创建一个元素createElement及删除一个元素
Jan 24 Javascript
详谈jQuery中的this和$(this)
Nov 13 Javascript
JavaScript版的TwoQueues缓存模型
Dec 29 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
Feb 17 Javascript
详解支持Angular 2的表格控件
Jan 19 Javascript
vue router仿天猫底部导航栏功能
Oct 18 Javascript
微信小程序实现卡片左右滑动效果的示例代码
May 01 Javascript
微信小程序上线发布流程图文详解
May 06 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
Oct 17 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 实现explort() 功能的详解
2013/06/20 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
各个系统下的Python解释器相关安装方法
2015/10/12 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
python-str,list,set间的转换实例
2018/06/27 Python
python实现朴素贝叶斯算法
2018/11/19 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
浅谈Python3中print函数的换行
2020/08/05 Python
phpquery中文手册
2021/03/18 PHP
巴黎一票通:The Paris Pass
2018/02/10 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
学生拾金不昧表扬信
2014/01/21 职场文书
网络教育自我鉴定
2014/02/04 职场文书
班级德育工作实施方案
2014/02/21 职场文书
低碳环保口号
2014/06/12 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书