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中为String对象添加trim,ltrim,rtrim方法
Sep 22 Javascript
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
JavaScript语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
DWR Ext 加载数据
Mar 22 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
May 05 Javascript
浅谈React Native Flexbox布局(小结)
Jan 08 Javascript
微信小程序使用template标签实现五星评分功能
Nov 03 Javascript
JS高阶函数原理与用法实例分析
Jan 15 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
Apr 30 Javascript
实例讲解JavaScript 计时事件
Jul 04 Javascript
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
vue 项目@change多个参数传值多个事件的操作
Jan 29 Vue.js
再次谈论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设计模式之结构模式的深入解析
2013/06/13 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
ext 代码生成器
2009/08/07 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
python编码最佳实践之总结
2016/02/14 Python
你应该知道的python列表去重方法
2017/01/17 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
初三政治教学反思
2014/01/30 职场文书
综艺节目策划方案
2014/06/13 职场文书
企业读书活动总结
2014/06/30 职场文书
民主生活会剖析材料
2014/09/30 职场文书
政风行风建设整改方案
2014/10/27 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
导游词之湖州-太湖
2019/10/11 职场文书
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
canvas 中如何实现物体的框选
2022/08/05 Javascript
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技