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 年月日联动实现核心代码
Dec 21 Javascript
修改好的jquery滚动字幕效果实现代码
Jun 22 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
Javascript基础知识(一)核心基础语法与事件模型
Sep 29 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
angular4 共享服务在多个组件中数据通信的示例
Mar 30 Javascript
js canvas实现写字动画效果
Nov 30 Javascript
VUE引入第三方js包及调用方法讲解
Mar 01 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 Javascript
js实现简单掷骰子小游戏
Oct 24 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 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中文汉字验证码
2007/04/08 PHP
第五章 php数组操作
2011/12/30 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
Python之eval()函数危险性浅析
2014/07/03 Python
python中list循环语句用法实例
2014/11/10 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
Python实现分段线性插值
2018/12/17 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
python cumsum函数的具体使用
2019/07/29 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
Python爬取梨视频的示例
2021/01/29 Python
最受欢迎的自我评价
2013/12/22 职场文书
带薪年假请假条
2014/02/04 职场文书
军训学生自我鉴定
2014/02/12 职场文书
社会公德演讲稿
2014/05/20 职场文书
广播体操比赛口号
2014/06/10 职场文书
贷款承诺书
2015/01/20 职场文书
工作收入证明模板
2015/06/12 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript
Flink 侧流输出源码示例解析
2022/09/23 Servers