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中通过URL传递汉字的方法
Apr 09 Javascript
十分钟打造AutoComplete自动完成效果代码
Dec 26 Javascript
基于jquery的商品展示放大镜
Aug 07 Javascript
Script的加载方法小结
Jan 12 Javascript
JavaScript生成二维码图片小结
Dec 27 Javascript
jQuery 插件实现随机自由弹跳气泡样式
Jan 12 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
bootstrap实现二级下拉菜单效果
Nov 23 Javascript
微信小程序实现鼠标拖动效果示例
Dec 01 Javascript
微信小程序使用Promise简化回调
Feb 06 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
Feb 23 Javascript
一些你可能不熟悉的JS知识点总结
Mar 15 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文件中是否含有bom的函数
2012/05/31 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
小型js框架veryide.librar源代码
2009/03/05 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
jQuery自定义添加"$"与解决"$"冲突的方法
2015/01/19 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
python实现跨文件全局变量的方法
2014/07/07 Python
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
土木工程专业推荐信
2014/02/19 职场文书
产品销售计划书
2014/05/04 职场文书
小学师德师风整改措施
2014/10/27 职场文书
实习科室评语
2015/01/04 职场文书
会计简历自我评价
2015/03/10 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
7个关于Python的经典基础案例
2021/11/07 Python