位置: 编程技术 - 正文

jQuery.deferred对象使用详解(jquery defaultvalue)

编辑:rootadmin

推荐整理分享jQuery.deferred对象使用详解(jquery defaultvalue),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:jquery deffered,jquery的find方法和children方法,jquery deffered,jquery deferred对象,jquery field,jquery field,jquery deferred对象,jquery field,内容如对您有帮助,希望把文章链接给更多的朋友!

一、前言jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式:

1).串行调用Ajax

这种方式代码可读性差,效率低,晦涩难懂,调试和排错的复杂度大。

2).并行调用Ajax

这种方式对于callbacks函数调用来说已经很不错了,并行取得数据,可读性良好。缺点就是代码冗长,可扩展性差,调试和排错的复杂度高。

jQuery1.5之后,增加了deferred对象。因此可以用下面这种方式实现和上面同样的需求。

1)Promise

可以看出,代码可读性良好,可扩展性高,并且大大降低了调试和排错的复杂度。

那么问题来了,promises和deferred对象究竟是个什么玩意呢?

二、详解2.什么是deferred对象?deferred对象即延迟对象,它是jQuery 1.5版本引入的一种回调函数的解决方案,代表了将要完成的某种操作,并且提供了一些方法,帮助用户使用。

deferred对象是对Promises接口的实现。jQuery 1.5版本以及之后所有的Ajax返回的jqXHR对象就是一个deferred对象。

2.deferred对象的几大好处2.1.为同一操作指定多个回调函数deferred对象的好处之一,就是它允许你为一个操作添加多个回调函数,这在传统的ajax中是无法实现的。

2.2.为多个操作指定同一个回调函数deferred对象的好处之二,就是它允许你为多个操作指定同一个回调函数,这在传统的ajax中也是无法实现的。

2.3.非Ajax操作的回调函数deferred对象的好处之三,就是它不再拘泥于ajax操作,任意的操作(ajax操作or本地操作/异步操作or同步操作)都可以使用deferred对象,指定回调函数。

一个很典型的耗时操作

2.4.链式调用jQuery中传统的ajax操作是这样的:

其中success指定ajax操作成功后的回调函数,error指定ajax操作失败后的回调函数。jQuery1.5版本之前,Ajax操作返回的是一个XMLHTTPRequest对象,不支持链式操作。1.5版本开始,ajax操作返回的是jqXHR对象,这是一个deferred对象,而deferred对象一个显著的好处就是可以进行链式操作,因为deferred对象的所有方法返回的均是deferred对象。

现在的ajax操作的写法是:

两种写法对比可以很明显的看出来,done()相当于传统ajax操作的success方法,fail()相当于传统ajax操作的fail方法。相对于传统的写法,代码可读性提高了。

3.deferred对象的方法3.1基本用法(1).生成deferred对象

var dfd = $.Deferred(); //create a deferred object(2).deferred对象的状态

deferred对象有三种状态

pending:表示操作处于未完成的状态,任何deferred(延迟)对象开始于pending状态。resolved:表示操作成功。rejected:表示操作失败。state()方法返回deferred对象的当前状态。

(3).改变deferred对象的状态

调用deferred.resolve() 或者 deferred.resolveWith()转换Deferred(递延)到resolved(解决)的状态,并立即执行设置中任何的doneCallbacks。

调用deferred.reject() 或者 deferred.rejectWith()转换Deferred(递延)到rejected(拒绝)的状态,并立即执行设置中任何的failCallbacks。

(4).绑定回调函数

deferred对象状态改变的时候,会触发回调函数。任何回调使用deferred.then(), deferred.always(), deferred.done()或者 deferred.fail()添加到这个对象都是排队等待执行。

pending-->resolved,执行设置中任何的doneCallbacks(done()指定),参数由resolved传递给doneCallbacks。pending-->rejected,执行设置中任何的failCallbacks(fail()指定),参数由resolved传递给failCallbacks。pending-->resolved/rejected,执行always()指定的callbacks,参数由resolved传递给callbacks。

如果在状态更改后附件一个callback则会立即执行callback,因此不必担心deferred对象何时被resolved或者rejected,因为无论何时,参数都会正确地传递给callbacks。

3.2.deferred对象的方法(1)$.Deferred([beforeStart]) -- 创建一个deferred对象,参数类型为Function,是一个在构造函数之前调用的函数。

(2)deferred.done(doneCallbacks [,doneCallbacks]) -- 当deferred(延迟)对象解决时,调用添加处理程序。

args:接受一个或者多个参数,所有的参数都可以是一个单一的函数或者函数数组,当deferred(延迟)对象解决时,doneCallbacks被调用。回调是依照他们添加的顺序执行的。

(3)deferred.fail(failCallbacks [,failCallbacks]) -- 当deferred(延迟)对象拒绝时,调用添加处理程序。

jQuery.deferred对象使用详解(jquery defaultvalue)

args:接受一个或者多个参数,所有的参数都可以是一个单一的函数或者函数数组,当deferred(延迟)对象拒绝时,failCallbacks被调用。回调是依照他们添加的顺序执行的。

(4)deferred.resolve(args) and deferred.resolveWith(context [,args]) -- 解决Deferred(延迟)对象,并根据给定的args参数(resolveWith给定context)调用任何doneCallbacks。

参数:args -- type(object),传递给回调函数(doneCallbacks)的可选的参数,

context -- type(object),Context(上下文)作为this对象传递给完成回调函数(doneCallbacks)。

resolve和resolveWith的区别就等同于fire和fireWith的区别。

(5)deferred.reject(args) and deferred.rejectWith(context [,args]) -- 拒绝Deferred(延迟)对象,并根据给定的args参数(rejectWith给定context)调用任何failCallbacks。

参数:args -- type(object),传递给回调函数(doneCallbacks)的可选的参数,

context -- type(object),Context(上下文)作为this对象传递给完成回调函数(doneCallbacks)。

reject和rejectWith的区别就等同于fire和fireWith的区别。

(6)deferred.promise([target]) -- 返回Deferred(延迟)的Promise(承诺)对象。

参数可选,无参数时返回一个Promise(承诺)对象,Promise(承诺)对象仅会暴露那些需要绑定额外的处理或判断状态的延迟方法(then, done, fail, always,pipe, progress, state,和 promise)时,并不会暴露任何用于改变状态的延迟方法(resolve, reject, notify,resolveWith, rejectWith, 和 notifyWith)。使用Promise(承诺)会阻止其他人破坏你制造的promise。

有参数时,会将事件绑定到参数上,然后返回该参数对象(返回的实际是一个扩展的Promise(承诺)对象)。

(7)$.when(deferreds) -- 提供一种方法来执行一个或多个对象的回调函数。

参数:type(Deferred),一个或多个延迟对象,或者普通的JavaScript对象。

参数仅传入一个单独的Deferred对象,返回它的Promise对象。

参数传入一个非Deferred和Promise对象,那么该参数会被当成一个被解决(resolved)的延迟对象,并且绑定到上面的任何doneCallbacks都会被立即执行。

无参数,返回一个resolved(解决)状态的Promise对象。

参数为多个Deferred对象,该方法根据一个新的“宿主” Deferred(延迟)对象,跟踪所有已通过Deferreds聚集状态,返回一个Promise对象。当所有的延迟对象被解决(resolve)时,“宿主” Deferred(延迟)对象才会解决(resolved)该方法,或者当其中有一个延迟对象被拒绝(rejected)时,“宿主” Deferred(延迟)对象就会reject(拒绝)该方法。

(8)deferred.then(doneFilter [,failFilter] [,progressFilter]) -- 当Deferred(延迟)对象解决,拒绝或仍在进行中时,调用添加处理程序。

参数:

doneFilter -- type(Function),当Deferred(延迟)对象得到解决时被调用的一个函数。failFilter -- type(Function),当Deferred(延迟)对象拒绝时被调用的一个函数,可选。progressFilter -- type(Function),当Deferred(延迟)对象生成进度通知时被调用的一个函数,可选。其实,then方法可以理解成,把done(),fail(),progress()合在一起写。

(9)deferred.always(alwaysCallbacks [,alwaysCallbacks]) -- 当Deferred(延迟)对象解决或拒绝时,执行alwaysCallbacks。

顾名思义,只要Deferred对象的状态发生更改(解决或者拒绝)均会调用alwaysCallbacks。

()deferred.state() -- 获取一个Deferred(延迟)对象的当前状态,不接受任何参数。

$.Deferred().state();//"pending"上面讲述过deferre(延迟)对象的三种状态,这个方法对于debug非常有用,例如,在准备reject一个deferred对象之前,判断它是否处于resolved状态。

()deferred.notify(args) and deferred.notifyWith()

()deferred.progress()

()deferred.pipe()

().promise()

()deferred.isRejected() 和 deferred.isResolved() -- 从jQuery 1.7开始被弃用,较新版本的jQuery类库中已经被删除,可以使用state()方法代替这两个方法。

()deferred.pipe() -- 从jQuery 1.8开始被弃用。

4.什么情况下使用deferred对象和Promises?上面讲了很多,那么我们究竟在什么情况下使用Deferred对象和Promises对象呢?

(1)复杂的动画

不知道动画什么时候结束,但是又必须在动画结束的时候做一些操作或者是启动其他的动画,这种情况下,如果采用其他的方式,很容易导致代码可读性差,尤其是还夹带着一些其它的操作,比如渲染、表单操作等,现在jQuery会为你的动画操作返回一个Promise,这样这些动画可以进行链式操作。

(2)处理队列

(3)The Wait promise

(4)典型的Ajax操作

(5)一些耗时的大循环操作

标签: jquery defaultvalue

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

上一篇:jquery基础知识第一讲之认识jquery(jquery基础知识梳理)

下一篇:基于jQuery实现收缩展开功能(jquery接收后端数据)

  • 金税盘开票系统怎么增加税目
  • 所得税 扣除
  • 小规模纳税人刚成立公司如何记账
  • 向银行借款存入银行会引起
  • 已经认证的发票对方可以作废吗
  • 在建工程领用原材料的账务处理
  • 公司对员工的罚款最多可以罚多少
  • 库存半成品属于什么会计科目
  • 合同副本和正本区别
  • 企业所得税弥补亏损明细表怎么填写
  • 一般纳税人出租不动产增值税税率
  • 消费税可以跨年计提吗
  • 关于纳税人取得的发票
  • 罚没支出包括税收滞纳金吗
  • 在建工程完工,并当日签订出租协议的会计分录
  • 总分类账户和明细分类账户平行登记的内容可以概括为
  • 关联方之间借款利息怎么开票
  • 管理费用金额多做了,如何减少
  • win10 20h2更新时间久
  • 购买交易性金融资产时,支付的交易费用应计入
  • win10图片密码怎么全屏显示
  • 酒店布草洗涤赔偿怎样折旧
  • PHP:mb_send_mail()的用法_mbstring函数
  • 黄金期货交易要怎么样
  • 零售商品盘点表填写内容
  • 财政补贴的内容分类
  • 进项发票认证后怎么做账
  • php实现原理
  • 委托研发技术合同登记
  • framework3.5启用
  • anaconda卸载干净
  • 收到利息收入计入什么科目
  • 个税系统有什么用
  • 金税盘税控盘和税务Ukey有什么区别
  • 应收账款资产负债表负数
  • photoshop虚化局部
  • 房地产企业年报数据
  • 公司一直没营业也没报税,会怎样罚款?
  • 公司购买食品如何入账科目
  • 免税收入货款要交税吗
  • 免税黄金什么意思
  • 新政府会计制度从什么时候开始实施
  • 报销差旅费的进项税额
  • 增值税专用发票有几联?
  • 新入股公司股权转让
  • 以前年度多计提成本怎么处理
  • 固定资产正常报废与非正常报废的会计处理基本相同
  • 走逃发票账务处理
  • 事业单位公务员考试条件
  • 银行存款支付投资者投入的款项54万
  • 承兑汇票贴现利息会计分录
  • 什么是盈余公积和资本公积
  • 旅行社开的发票如何记账?
  • 利润表的未分配利润是哪个
  • 营改增后,小规模纳税人广联达
  • 工业企业成本占比多少合适
  • 企业持有的能够对被投资单位实施控制的长期股权投资
  • 小企业会计怎么做账
  • 其他应收款怎么冲平
  • 零售商品销售的具体核算步骤
  • sqlserver远程连接设置
  • secbizsrv.exe是什么程序
  • vic32.dll是什么
  • windows注册表保存在BIOS
  • linux系统开机黑屏啥也没有
  • win98拨号上网
  • win7开机时出现一堆英文
  • gzip: stdin: unexpected end of file tar: Unexpected EOF in archive tar: Unexpect
  • 在linux操作系统中
  • linux如何修改网关地址
  • w7开机界面
  • 如何用jquery
  • 批处理 重命名
  • framework res.apk
  • unity销毁预制体
  • python中编写程序
  • 河南省医保卡中心电话
  • 税务局风控
  • 医保账户被扣财富怎么办
  • 兰州税收优惠园在哪
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设