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 相关文章推荐
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
Nov 30 Javascript
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
JavaScript利用append添加元素报错的解决方法
Jul 01 Javascript
jQuery中[attribute^=value]选择器用法实例
Dec 31 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
Mar 14 Javascript
Bootstrap每天必学之按钮(Button)插件
Apr 25 Javascript
jQuery实现图像旋转动画效果
May 29 Javascript
微信小程序 实现拖拽事件监听实例详解
Nov 16 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
Nov 23 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
Feb 19 Javascript
Vue.js实现表格渲染的方法
Sep 07 Javascript
JS实现电脑虚拟键盘打字测试
Jun 24 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHP中mysql_field_type()函数用法
2014/11/24 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
微信小程序实现留言板
2018/10/31 Javascript
Vue Prop属性功能与用法实例详解
2019/02/23 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
python自动安装pip
2014/04/24 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python使用OpenCV进行标定
2018/05/08 Python
python 搜索大文件的实例代码
2019/07/08 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
如何转换一个字符串到enum值
2014/04/12 面试题
学校党支部承诺书
2015/04/30 职场文书
党小组评议意见
2015/06/02 职场文书
《梅花魂》教学反思
2016/02/18 职场文书