位置: 编程技术 - 正文

深入解析jQuery中Deferred的deferred.promise()方法(jquery源码解析)

编辑:rootadmin

推荐整理分享深入解析jQuery中Deferred的deferred.promise()方法(jquery源码解析),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:jquery原理解析,jquery解析表单数据的方法,jquery解析html文本,jquery解析表单数据的方法,jquery解析html文本,jquery 解析json,jquery 解析json,jquery原理解析,内容如对您有帮助,希望把文章链接给更多的朋友!

deferred.promise() 和 .promise()

这两个API语法几乎一样,但是有着很大的差别。deferred.promise()是Deferred实例的一个方法,他返回一个Deferred.Promise实例。一个Deferred.Promise对象可以理解为是deferred对象的一个视图,它只包含deferred对象的一组方法,包括:done(),then(),fail(),isResolved(), isRejected(), always(),这些方法只能观察一个deferred的状态,而无法更改deferred对象的内在状态。这非常适合于API的封装。例如一个deferred对象的持有者可以根据自己的需要控制deferred状态的状态(resolved或者rejected),但是可以把这个deferred对象的Promise对象返回给其它的观察者,观察者只能观察状态的变化绑定相应的回调函数,但是无法更改deferred对象的内在状态,从而起到很好的隔离保护作用。

deferred.promise()

deferred.promise()也可以接受一个object参数,此时传入的object将被赋予Promise的方法,并作为结果返回。

deferred.promise() 只是阻止其他代码来改变这个 deferred 对象的状态。可以理解成,通过 deferred.promise() 方法返回的 deferred promise 对象,是没有 resolve ,reject, progress , resolveWith, rejectWith , progressWith 这些可以改变状态的方法,你只能使用 done, then ,fail 等方法添加 handler 或者判断状态。

deferred.promise() 改变不了 deferred 对象的状态,作用也不是保证目前的状态不变,它只是保证你不能通过 deferred.promise() 返回的 deferred promise 对象改变 deferred 对象的状态。如果我们这个地方直接返回 dtd,也是可以工作的,.done 的处理函数还是会等到 dtd.resolve() 之后才会执行.

具体在那篇博客的例子, 如果我们把代码改成如下的形式:

这样的执行结果和先前返回 dtd.promise 的结果是一样的。

差别在什么地方呢?如果我们把 $.when 的这块的代码改成这样的:

我们会发现 alert(“哈哈,成功了!”) 会立即执行,“执行完毕”却需要5秒后才弹出来。

但是如果我们 wait 函数最后是 return dtd.promise() 这里 d.resolve() 就会报错了,因为对象 d 不存在 resolve() 方法。

同样如果我们把代码改成:

深入解析jQuery中Deferred的deferred.promise()方法(jquery源码解析)

我们也可以发现 alert(“哈哈,成功了!”) 会立即执行,因为 dtd 这个 deferred 对象在被传入 wait 之前,已经被 resolve() 了,而 deferred 对象一旦被 resolve 或者 reject 之后,状态是不会改变的。

然后我们再把 $.wait 这块的代码改成:

我们也会发现 alert(“哈哈,成功了!”); 被立即执行,虽然 wait(dtd) 执行的时候, dtd 还没有被 resolve,而且 wait 方法返回的是 dtd.promise(), 但是 dtd 这个原始的 deferred 对象是暴露在外面的,我们还是可以从外面改变它的状态。

于是,如果我们真的不想让其他代码能改变 wait 方法内部的 deferred 对象的状态,那我们应该写成这样:

也就是不要把 deferred 直接暴露出来,最后返回 deferred.promise() ,让其他地方的代码只能添加 handler 。

.promise()

首先这不是Deferred实例的方法!该方法是jQuery实例的方法。该方法用于一组类型的动作(例如动画)全部完成后返回一个Promise对象,供事件监听器监听其状态并执行相应的处理函数。

该方法接受两个可选参数:.promise( [type,] [target] )

type:队列的类型,默认值是fx,fx即jQuery对象的动画. targetObject :要赋予Promise行为的对象,

这两个参数是可选的。其中第一个参数(我)目前除了fx还没有找到其他的值类型。因此一般都是用于动画的监控,在动画完成后做一些操作。

例子:没有动画效果直接返回一个resolved状态的promise对象

例子:在动画效果全部完成后触发done()监听函数

jQuery中队列queue()函数的实例教程 如果当前jQuery对象匹配多个元素:获取队列时,只获取第一个匹配元素上的队列;设置队列(替换队列、追加函数)时,则为每个匹配元素都分别进行设置

javascript截图 jQuery插件imgAreaSelect使用详解 为了使用户能自定义个人头像,需要提供一个对上传图片的截图功能,当前很多网站特别是SNS类网站都提供这样的功能,非常实用。主要实现的形式有

Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】 最近的后台项目前端使用了jqueryui日历控件自然就使用了jqueryui的datepicker后台数据比较好大,一般是千万级的和百万级的关联,查询会很慢,所以后加想

标签: jquery源码解析

本文链接地址:https://www.jiuchutong.com/biancheng/385793.html 转载请保留说明!

上一篇:详解JavaScript异步编程中jQuery的promise对象的作用(javascript异常)

下一篇:jQuery中队列queue()函数的实例教程(js 队列)

  • 属于印花税征税对象的是
  • 网上申报办税
  • 个人所得税的税目分多少种
  • 计税工资和实发工资不一样所得税
  • 建筑服务增值税税率
  • 财务报表年报怎么更正
  • 其他应收款收到发票怎么写会计分录
  • 办公室提前退租未摊完的装修费如何处理
  • 提供应税服务的企业
  • 个体户购买发票需要什么资料
  • 先转款后开票会计分录
  • 出口抵减内销产品
  • 实收资本没到账,一直挂其他应收款,有啥影响
  • 赠送给客户
  • 劳动争议的解决途径不可以直接选择的是
  • 海运费需要代扣代缴吗
  • 作废发票进项税怎么处理
  • 季度销售额不超过30万,城建税减免
  • 材料报废的会计处理(一般纳税人)
  • 开具发票必须附列清单吗
  • 环卫公司增值税税率
  • 外汇局网上申报
  • 纳税期限变更需要什么
  • 进项税额加计抵减怎么做分录
  • 存货跌价准备可以转回吗?
  • 企业所得税汇算清缴补缴税款分录
  • win11任务管理器怎么没有了
  • 虚拟机vm怎么用
  • 苹果电脑优酷视频打不开
  • PHP:pg_lo_read_all()的用法_PostgreSQL函数
  • php最好的编程语言
  • 母公司收取子公司利润交增值税吗
  • 午夜太阳的意思
  • 老生常谈php中传统验证与thinkphp框架(必看篇)
  • 第三方代收的款项是什么意思
  • 情感计算的应用
  • vue 插槽详解
  • php身份证号码验证
  • 深入理解php类的知识
  • 发票公司名字开错,需要更改红字发票上的名字吗
  • 业务招待费可以结转以后年度扣除吗
  • 印花税没交会怎么样
  • 社保退回的款怎么继承
  • 免征企业所得税的有哪些行业
  • sql server使用sql语句
  • 织梦模板改成帝国模板
  • 个体工商户购买生育险有生育津贴吗
  • 员工加班打车费报销
  • 企业所得税汇算清缴扣除标准2023
  • 工程施工二级设哪些明细
  • 安装sqlserver2005警告iis
  • 弥补以前年度亏损后怎么交所得税
  • 小规模纳税人利润率一般是多少
  • 进账税发票未认账怎么办
  • 老板自己出钱买办公用品怎么做账
  • 进项税额与库存的关系
  • 商贸公司经营范围可以写烟酒吗
  • 企业存货明细表和盘点表
  • 开出银行汇票支付货款
  • 建筑业增值税会退税吗
  • 退回投标保证金在投诉阶段怎么办
  • 押金为什么要走支付宝
  • 收派服务费可以简易计税吗
  • 需求价格弹性是ep还是ed
  • sqlserver 修改列类型
  • 启动mysql1067错误
  • win10下载mysql图解
  • 解析包出现错误无法安装怎么办
  • office解压后如何安装
  • windows升级10
  • cssli
  • 拖拽js实现
  • python中安装模块的命令
  • nodejs的流处理模块
  • javascript Keycode对照表
  • 电子票怎么申领到开票系统
  • 税务扣税账户余额不足
  • 外购应税消费品用于生产非应税消费品
  • 递延所得税资产怎么计算
  • 委托人全权代理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设