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 Mobile 自定义按钮图标
Nov 18 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
Jan 21 Javascript
Node.js获取前端ajax提交的request信息
Feb 20 Javascript
基于Node.js模板引擎教程-jade速学与实战1
Sep 17 Javascript
简述Angular 5 快速入门
Nov 04 Javascript
详解如何优雅地在React项目中使用Redux
Dec 28 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
vue.js中toast用法及使用toast弹框的实例代码
Aug 27 Javascript
webpack4 SplitChunks实现代码分隔详解
May 23 Javascript
微信小程序制作扭蛋机代码实例
Sep 24 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
Dec 20 jQuery
基于js实现的图片拖拽排序源码实例
Nov 04 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将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
DWZ刷新dialog解决方法
2013/03/03 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
Python读取网页内容的方法
2015/07/30 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
python3实现名片管理系统
2020/11/29 Python
python实现多张图片拼接成大图
2019/01/15 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
P/Invoke是什么
2015/07/31 面试题
实习期自我鉴定
2013/10/11 职场文书
舞蹈教育学专业推荐信
2013/11/27 职场文书
优秀企业获奖感言
2014/02/01 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
学生会主席演讲稿
2014/04/25 职场文书