在Jquery中,对比异步回调函数管理工具方法中的$.Callbacks,还有一个更加方便的管理异步回调函数的工具方法,而且这是一个有状态的方法 — $.Deferred。
如果不了解 $.Callbacks方法,建议先看我上一篇文章Callbacks基本使用

关于$.Deferred

为了更好区分回调函数,jquery内部给Deferred对象定义了三种注册和调用函数的方法:

类型 注册 调用
成功状态 $.Deferred.done(fn) $.Deferred.resolve(参数)
失败状态 $.Deferred.fail(fn) $.Deferred.reject(参数)
进行状态 $.Deferred.progress(fn) $.Deferred.notify(参数)

本质上done和fail原理是一样的,只是为了通过函数名来更好的区分,成功和失败回调的函数,他们和progress区别就是,progress状态的函数会继续执行异步任务,直到达到done或fail的回调条件为止,而达到done或fail执行条件的时候,会终止当前异步任务。

案例:

<script>// 回调函数var master = function(){console.log('你是最棒的')}var good = function(){console.log('还不错')}var loser = function(){console.log('太差劲了')}// 声明deferred对象var deferred = $.Deferred()// 注册成功时 触发的函数deferred.done(master)// 注册失败时 触发的函数deferred.fail(loser)// 注册进行时 触发的函数deferred.progress(good)// 通过定时器异步任务,调用不同的回调函数var timer = setInterval(function(){var num = Math.random()*100if(num > 85){// 成功时 回调deferred.resolve()}else if(num < 60){// 失败时 回调deferred.reject()}else{// 进行时 回调deferred.notify()}},1500)</script>

以上这种案例 deferred对象是全局的,resolve,reject,notify还是可以被人为的在全局直接调用,因此这是不太合理的。resolve,reject,notify这三个触发函数必须是由某种特定条件才能调用,因此我们需要通过promise方法,只允许外部注册函数,不允许调用函数。
案例改造如下:

<script>// 回调函数var master = function(){console.log('你是最棒的')}var good = function(){console.log('还不错')}var loser = function(){console.log('太差劲了')}var asyn = function(){// 声明deferred对象var deferred = $.Deferred()// 通过定时器异步任务,调用不同的回调函数setInterval(function(){var num = Math.random()*100if(num > 85){// 成功时候调用deferred.resolve()}else if(num < 60){// 失败调用deferred.reject()}else{// 进行中调用deferred.notify()}},1500)return deferred.promise()}//获取promisevar deferred = asyn() // 注册成功时 触发的函数deferred.done(master)// 注册失败时 触发的函数deferred.fail(loser)// 注册失败时 触发的函数deferred.progress(good)</script>

简化注册函数写法:then

原来:

    // 注册成功时 触发的函数deferred.done(master)// 注册失败时 触发的函数deferred.fail(loser)// 注册进行中的函数deferred.progress(good)

简化:

 //注册顺序为:成功,失败,进行中的函数deferred.then(master,loser,good)

链式调用then

  //形式如:deferred.then(master,loser,good) .then(fn1,fn2,fn3).then(fn1,fn2,fn3)

链式调用的前提是上个then返回一个promise对象。

案例:

<script>// 回调函数var master = function(){console.log('你是最棒的')return asyn()// 成功时 继续执行异步任务 并且返回promise}var good = function(){console.log('还不错')return asyn()// 进行时 继续执行异步任务 并且返回promise}var loser = function(){console.log('太差劲了')return asyn()// 失败时 继续执行异步任务 并且返回promise}var asyn = function(){// 声明deferred对象var deferred = $.Deferred()// 通过定时器异步任务,调用不同的回调函数setInterval(function(){var num = Math.random()*100if(num > 85){// 成功时候调用deferred.resolve()}else if(num < 60){// 失败调用deferred.reject()}else{// 进行中调用deferred.notify()}},1500)return deferred.promise()}//获取promisevar deferred = asyn() deferred.then(master,loser,good).then(master,loser,good)//执行了两次回调</script>

最新文章

  1. 皮纹生物识别多元智力测量的科学原理
  2. 计算机组成原理 — 服务器组成
  3. python数学公式代码导入_在Matplotlib图中插入LaTex公式实例
  4. php prism,漂亮的代码语法高亮库:Prism.js
  5. iis无法读取配置文件_SpringBoot 有很多读取配置文件的方法,你知道几个? 静态方法读取呢?...
  6. MYSQL 定时任务
  7. C语言标准库中常见字符串处理函数
  8. apache、node.js、nginx、tomcat的关系
  9. Dev c++一些调试方法
  10. 韩语在线翻译图片识别_3个OCR文字识别工具,最后一个许多人都不知道!
  11. IE兼容模式文件上传所遇问题解决
  12. 加息对股市影响利好还是利空
  13. ECTouch多语言插件,ECSHOP手机版多语言翻译,ecshop手机端多国语言翻译切换,ECSHOP网站多语言切换
  14. js_中国大陆加港澳台手机正则验证
  15. 【每日新闻】​阿里钉钉布局医疗行业生态,未来医院成医疗行业“香饽饽” | 工信部信软司:持续推进云计算和区块链等领域标准研制工作...
  16. 用Arduino做一个能发射水弹的遥控小车
  17. excel群发邮件 支持html,怎么给excel表格中的邮箱群发邮件
  18. 北京甲骨文java_北京海淀甲骨文java企业项目
  19. Python基础知识(二)基本数据结构list列表和dict字典
  20. BCV和BEV是个什么鬼?

热门文章

  1. 怀旧服务器联盟优势,魔兽怀旧服:各阵营优势服务器推荐,这些深坑不要踩!...
  2. Python绘制和保存动态图(gif或MP4)
  3. linux查看服务器相关统计数据
  4. 浅浅的聊一下 WebSocket
  5. nokia n1 android 6,细数6款为Nokia N1铺路的平板:最早一款比iPad大9岁(图)
  6. 【干货】选择外贸邮件群发软件,外贸邮件营销软件,邮件群发代发软件15条建议!
  7. 罗氏医疗器械曝多个漏洞,可能会危及患者人身安全
  8. Windows10 中如何修改默认浏览器设置
  9. 安装win7的时候出现“安装程序无法创建新的系统分区,也无法定位系统分区”
  10. CMCC-EDU一个帐号,多设备共享解决方案