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 日期分离成年月日的代码
May 14 Javascript
js动态添加onclick事件可传参数与不传参数
Jul 29 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
May 25 Javascript
纯JS打造网页中checkbox和radio的美化效果
Oct 13 Javascript
浅谈jQuery操作类数组的工具方法
Dec 23 Javascript
详解如何使用Vue2做服务端渲染
Mar 29 Javascript
JavaScript解析任意形式的json树型结构展示
Jul 23 Javascript
ng-alain表单使用方式详解
Jul 10 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
vue中$nextTick的用法讲解
Jan 17 Javascript
原生JS实现九宫格抽奖
Sep 13 Javascript
详解CocosCreator消息分发机制
Apr 16 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
cmd下运行php脚本
2008/11/25 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
javascript 操作符(~、&、|、^、)使用案例
2014/12/31 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
python3实现磁盘空间监控
2018/06/21 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
Python内置加密模块用法解析
2019/11/25 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
Champion官网:美国冠军运动服装
2017/01/25 全球购物
员工自我鉴定范文
2013/10/06 职场文书
医药代表个人求职信范本
2013/12/19 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
倡议书格式
2014/04/14 职场文书
HAM-2000摩机图
2021/04/22 无线电
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle