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小框架 fly javascript framework
Nov 26 Javascript
纯js模拟div层弹性运动的方法
Jul 27 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
详解javascript数组去重问题
Nov 06 Javascript
Javascript将JSON日期格式化
Aug 23 Javascript
JQuery Ajax WebService传递参数的简单实例
Nov 02 Javascript
分类解析jQuery选择器
Nov 23 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
Javascript网页抢红包外挂实现分享
Jan 11 Javascript
javaScript中"=="和"==="的区别详解
Mar 16 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
详解 微信小程序开发框架(MINA)
May 17 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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
php session 预定义数组
2009/03/16 PHP
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
iOS10推送通知开发教程
2016/09/19 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
ECMAScript6--解构
2017/03/30 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
python实现学生信息管理系统源码
2021/02/22 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
如何保障Web服务器安全
2014/05/05 面试题
建龙钢铁面试总结
2014/04/15 面试题
一份婚庆公司创业计划书
2014/01/11 职场文书
员工培训邀请函
2014/02/02 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
施工安全生产承诺书
2014/05/23 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
写给老师的保证书
2015/05/09 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫