深化解析jQuery中Deferred的deferred.promise()方法__第1页
深化解析jQuery中Deferred的deferred.promise()方法__第2页
深化解析jQuery中Deferred的deferred.promise()方法__第3页
深化解析jQuery中Deferred的deferred.promise()方法__第4页
深化解析jQuery中Deferred的deferred.promise()方法__第5页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深化解析jQuery中Deferred的mise()方法_ 这篇文章主要介绍了jQuery中Deferred的mise()方法,提示千万要留意mise()与jQuery的.promise() 实例方法的区分,需要的伴侣可以参考下 mise() 和 .promise() 这两个API语法几乎一样,但是有着很大的差别。mise()是Deferred实例的一个方法,他返回一个Deferred.Promise实例。一个Deferred.Promise对象可以理解为是deferred对

2、象的一个视图,它只包含deferred对象的一组方法,包括:done(),then(),fail(),isResolved(), isRejected(), always(),这些方法只能观看一个deferred的状态,而无法更改deferred对象的内在状态。这特别适合于API的封装。例如一个deferred对象的持有者可以依据自己的需要掌握deferred状态的状态(resolved或者rejected),但是可以把这个deferred对象的Promise对象返回给其它的观看者,观看者只能观看状态的改变绑定相应的回调函数,但是无法更改deferred对象的内在状态,从而起到很好的隔离爱护作

3、用。 mise() $(function() / var deferred = $.Deferred(); var promise = mise(); var doSomething = function(promise) promise.done(function() alert(deferred resolved.); ); ; deferred.resolve(); doSomething(promise); ) mise()也可以接受一个object参数,此时传入的object将被给予Promise的方法,并作为结

4、果返回。 / Existing object var obj = hello: function( name ) alert( Hello + name ); , / Create a Deferred defer = $.Deferred(); / Set object as a promise mise( obj ); / Resolve the deferred defer.resolve( John ); / Use the object as a Promise obj.done(function( name ) this.hello( name ); / will

5、 alert Hello John ).hello( Karl ); / will alert Hello Karl mise() 只是阻挡其他代码来转变这个 deferred 对象的状态。可以理解成,通过 mise() 方法返回的 deferred promise 对象,是没有 resolve ,reject, progress , resolveWith, rejectWith , progressWith 这些可以转变状态的方法,你只能用法 done, then ,fail 等方法添加 handler 或者推断状态。 deferred.pr

6、omise() 转变不了 deferred 对象的状态,作用也不是保证目前的状态不变,它只是保证你不能通过 mise() 返回的 deferred promise 对象转变 deferred 对象的状态。假如我们这个地方挺直返回 dtd,也是可以工作的,.done 的处理函数还是会等到 dtd.resolve() 之后才会执行. 具体在那篇博客的例子, 假如我们把代码改成如下的形式: var dtd = $.Deferred(); / 新建一个deferred对象 var wait = function(dtd) var tasks = function() alert

7、(执行完毕!); dtd.resolve(); / 转变deferred对象的执行状态 ; setTimeout(tasks,5000); return dtd; ; $.when(wait(dtd) .done(function() alert(哈哈,胜利了!); ) .fail(function() alert(出错啦!); ); 这样的执行结果和从前返回 mise 的结果是一样的。 差别在什么地方呢?假如我们把 $.when 的这块的代码改成这样的: var d = wait(dtd); $.when(d) .done(function() alert(哈哈,胜利了!);

8、) .fail(function() alert(出错啦!); ); d.resolve(); 我们会发觉 alert(“哈哈,胜利了!”) 会立刻执行,“执行完毕”却需要5秒后才弹出来。 但是假如我们 wait 函数最终是 return mise() 这里 d.resolve() 就会报错了,由于对象 d 不存在 resolve() 方法。 同样假如我们把代码改成: var dtd = $.Deferred(); / 新建一个deferred对象 var wait = function(dtd) var tasks = function() alert(执行完毕!); dtd.

9、resolve(); / 转变deferred对象的执行状态 ; setTimeout(tasks,5000); return mise(); ; dtd.resolve(); $.when( wait(dtd) .done(function() alert(哈哈,胜利了!); ) .fail(function() alert(出错啦!); ); 我们也可以发觉 alert(“哈哈,胜利了!”) 会立刻执行,由于 dtd 这个 deferred 对象在被传入 wait 之前,已经被 resolve() 了,而 deferred 对象一旦被 resolve 或者 reject 之后

10、,状态是不会转变的。 然后我们再把 $.wait 这块的代码改成: $.when( wait(dtd) .done(function() alert(哈哈,胜利了!); ) .fail(function() alert(出错啦!); ); dtd.resolve(); 我们也会发觉 alert(“哈哈,胜利了!”); 被立刻执行,虽然 wait(dtd) 执行的时候, dtd 还没有被 resolve,而且 wait 方法返回的是 mise(), 但是 dtd 这个原始的 deferred 对象是暴露在外面的,我们还是可以从外面转变它的状态。 于是,假如我们真的不想让其他代码能转

11、变 wait 方法内部的 deferred 对象的状态,那我们应当写成这样: var wait = function() var dtd = $.Deferred(); / 新建一个deferred对象 var tasks = function() alert(执行完毕!); dtd.resolve(); / 转变deferred对象的执行状态 ; setTimeout(tasks,5000); return mise(); ; $.when( wait() .done(function() alert(哈哈,胜利了!); ) .fail(function() alert(出错啦

12、!); ); 也就是不要把 deferred 挺直暴露出来,最终返回 mise() ,让其他地方的代码只能添加 handler 。 .promise() 首先这不是Deferred实例的方法!该方法是jQuery实例的方法。该方法用于一组类型的动作(例如动画)全部完成后返回一个Promise对象,供大事监听器监听其状态并执行相应的处理函数。 该方法接受两个可选参数:.promise( type, target ) type:队列的类型,默认值是fx,fx即jQuery对象的动画. targetObject :要给予Promise行为的对象, 这两个参数是可选的。其中第一个参数(我)目前除了fx还没有找到其他的值类型。因此一般都是用于动画的监控,在动画完成后做一些操作。 例子:没有动画效果挺直返回一个resolved状态的promise对象 var div = $( div / ); mise().done(function( arg1 ) / 将会被马上触发 alert( this = div

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论