接上一回的内容,漏了一个always()方法,参数也是回调函数,与done和fail不同的是,无论任何情况都执行always方法中的回调。

deferred对象的使用(二)

deferred对象不光可以用在jquery的ajax方法中,他提供了一系列的接口,使它的通用型大大提高。

比如有这样一个耗时比较久的方法

function a(){
function b(){
alert('start');
}
setTimeout(b, 3000);
}

如果要在这个方法之后执行某个回调,就不能用$.when()了,因为当$.when()的参数不为deferred对象是会直接调用done或者always中的回调函数。

这个时候就要使用deferred对象的其他方法了,还是上面的方法,做一些改写

function a(){
var def = $.Deferred(); // 创建deferred对象
function b(){
alert('start');
def.resolve(); // 改变deferred对象的状态
}
setTimeout(b, 3000);
return def;
} $.when(a()).done(function(){
alert("It's callback");
});

分析一下:

1. $.Deferred()方法会创建一个deferred对象

2. def.resolve()会改变deferred对象的状态,deferred对象有三种状态,未完成,成功,失败。

它有resolve()和reject()两个方法,resolve方法可以把对象状态改为成功,reject方法可以把状态改为失败。

又有以上的写法会出现问题,返回的deferred对象可以被外部改变状态,所以还提供了一个promise()方法,这个方法会在deferred对象的基础上返回一个新的deferred对象,不同的是,返回的对象只存在可被观察到状态,而不具备可改变其状态的方法,类似返回了一个只读的deferred对象。

所以同样的例子可以改写成这样

function a(){
var def = $.Deferred(); // 创建deferred对象
function b(){
alert('start');
def.resolve(); // 改变deferred对象的状态
}
setTimeout(b, 3000);
return def.promise();
} $.when(a().reject()).done(function(){ // reject()方法无效
alert("It's callback");
});

最新文章

  1. 导出BOM表
  2. bzoj3876: [Ahoi2014]支线剧情
  3. apache 反向代理配置
  4. ECMAScript 6中的let和const关键词
  5. AngularJS向指令传递数据
  6. JAVA设计模式之责任链模式
  7. 检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下:
  8. Windows下用cmd命令安装及卸载服务
  9. Android 如何动态改变Actionbar上的item图标
  10. leetcode之Count Complete Tree Nodes
  11. GUI(主)线程与子线程之间的通信(用信号槽通讯)
  12. IE6下position:fixed不支持问题及其解决方式
  13. 用C#开发一个 UWP BLUETOOTH BLE 扫描APP
  14. ionic项目上划刷新和下拉刷新
  15. python3基础视频教程
  16. poj1699
  17. VMware安装windows10系统
  18. CentOS下双网卡双IP不同IP段配置
  19. BAE静态文件问题
  20. [翻译] FSLineChart

热门文章

  1. linux命令之awk
  2. STL 练习
  3. Bootstrap组件系列之福利篇几款好用的组件(推荐)
  4. spring cache之自定义keys的过期时间
  5. 使用wifi网卡笔记1----网卡选型、开发环境搭建、内核配置
  6. 5月22日上课笔记-js属性选择器、过滤选择器、鼠标事件
  7. module解析过程
  8. django之admin站点
  9. 微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003
  10. GeoServer之图层的新建与发布