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 相关文章推荐
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 Javascript
js实现下拉框选择要显示图片的方法
Feb 16 Javascript
javascript的BOM汇总
Jul 16 Javascript
很实用的js选项卡切换效果
Aug 12 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
May 08 Javascript
Vue登录注册并保持登录状态的方法
Aug 17 Javascript
electron实现qq快捷登录的方法示例
Oct 22 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 Javascript
sortable+element 实现表格行拖拽的方法示例
Jun 07 Javascript
JS中超越现实的匿名函数用法实例分析
Jun 21 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
Aug 05 Javascript
Node.js实现断点续传
Jun 23 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动态图像的创建
2006/10/09 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
JavaScript函数详解
2014/11/17 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
js观察者模式的弹幕案例
2020/11/23 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
用Python实现数据的透视表的方法
2018/11/16 Python
python爬取网易云音乐评论
2018/11/16 Python
Python属性和内建属性实例解析
2020/01/14 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
个人求职简历中英文自我评价
2013/12/16 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
初中成绩单评语
2014/12/29 职场文书
端午节寄语2015
2015/03/23 职场文书
微信搭讪开场白
2015/05/28 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang