jQuery deferred 对象的 promise 方法
2014-06-20 17:44
344 查看
jQuery deferred 对象的 promise 方法
jQuery 从 1.5 版本引入了 deferred 对象,这是一个基于 CommonJS Promises/A 的设计,为了方便异步操作,大家都知道,在 js 中,异步代码是非常的多。这篇博客不是来详细讲解 $.Dererred 的,阮一峰 的博客里有一篇博客详细介绍了这个。但是在这篇博客中,关于
promise() 这个方法的讲解却是错误的,我发现这个是因为我徒弟去学习这个的时候,看了这篇文章,然后我让他给我讲述的时候,发现了这个错误。所以我想写篇 blog 来说明下。
这里有两个地方需要注意。
首先,最后一行不能直接返回dtd,必须返回dtd.promise()。原因是jQuery规定,任意一个deferred对象有三种执行状态—-未完成,已完成和已失败。如果直接返回dtd,$.when()的默认执行状态为”已完成”,立即触发后面的done()方法,这就失去回调函数的作用了。dtd.promise()的目的,就是保证目前的执行状态—-也就是”未完成”—-不变,从而确保只有操作完成后,才会触发回调函数。
下面是
jQuery 的官方文档:
The
deferred.promise()method allows an asynchronous function to prevent other code from interfering with the progress or status of its internal request. The Promise exposes only the Deferred methods needed to attach
additional handlers or determine the state (
then,
done,
fail,
always,
pipe,
progress, and
state), but not ones that change the state (
resolve,
reject,
progress,
resolveWith,
rejectWith,
and
progressWith).
也就是说,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() 之后才会执行.
具体在那篇博客的例子, 如果我们把代码改成如下的形式:
[code= js prettyprint prettyprinted">
相关文章推荐
- 以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
- jquery源码解析:jQuery延迟对象Deferred(工具方法)详解1
- jQuery中deferred对象使用方法详解
- jQuery中的deferred对象和extend方法详解
- jquery基础教程之deferred对象使用方法
- jQuery的promise与deferred对象在异步回调中的作用
- jquery deferred对象 then(),when()方法 ,解决回调函数嵌套
- jquery 中的deffered和promise对象方法及$when done then的使用
- [轉]在jQuery1.5中使用deferred对象 - 拿着放大镜看Promise
- jquery源码解析:jQuery延迟对象Deferred(工具方法)详解2
- jQuery的deferred对象和promise对象
- jQuery deffered和promise对象方法
- 深入解析jQuery中Deferred的deferred.promise()方法
- [原创]在jQuery1.5中使用deferred对象 - 拿着放大镜看Promise
- 使用jQuery Deferred对象实现Promise
- [原创]在jQuery1.5中使用deferred对象 - 拿着放大镜看Promise
- jquery基础教程之deferred对象使用方法
- 一个基于jQuery延迟对象Deferred的异步任务处理方法
- 在jQuery1.5中使用deferred对象 着放大镜看Promise
- jQuery中deferred、promise对象的使用