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 相关文章推荐
我见过最全的个人js加解密功能页面
Dec 12 Javascript
jQuery.clean使用方法及思路分析
Jan 07 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
Nov 30 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
JS中对Cookie的操作详解
Aug 05 Javascript
AngularJS动态生成div的ID源码解析
Aug 29 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
解决JS外部文件中文注释出现乱码问题
Jul 09 Javascript
AngularJs 终极购物车(实例讲解)
Nov 08 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 Javascript
详解javascript void(0)
Jul 13 Javascript
JavaScript ES6的函数拓展
Jan 18 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程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
javascript 事件绑定问题
2011/01/01 Javascript
jquery foreach使用示例
2013/09/12 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
JS验证字符串功能
2017/02/22 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
python将unicode转为str的方法
2017/06/21 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
Python request post上传文件常见要点
2020/11/20 Python
英国在线泳装店:Simply Swim
2019/05/05 全球购物
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
个人自我剖析材料
2014/09/30 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
火烧圆明园观后感
2015/06/03 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android
Nginx配置使用详解
2022/07/07 Servers