jquery中deferred和promise

来源:互联网 发布:阿里云手机刷机 编辑:程序博客网 时间:2024/05/16 23:59

通过以下两篇博客就可以对deferred和promise有很深入的了解了。

JavaScript异步编程的Promise模式

http://www.infoq.com/cn/news/2011/09/js-promise

jQuery的deferred对象详解

http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

 

主要解决的问题:当一个异步依赖于另一个异步请求的结果时,或者某个操作需要等另外几个操作都结束后才开始等。更强大的是从ajax操作扩展到了所有操作。动画、定时中也常用

我能想到的一个案例:

在店铺列表页需要拉取店铺的基本信息(名称、主营、图标等),同时需要从另一接口拉取每个店铺的辅助信息(相符度星级、优惠活动信息等)。页面计划先从第一个接口拉到数据后使用第一个模板填充基本信息显示出来,再从第二个接口拉辅助信息并填充到已经生成的店铺中,那么就会出现ajax回调嵌套。

Deferred对象就是jquery的回调函数解决方案,在jquery1.5版本前ajax返回一个XHR对象,1.5后返回defferred对象,可以进行链式操作

允许指定多个事件执行完后的回调函数,这些事件只要有一个失败就只会执行fail()指定的回调。

deferred对象的最大优点,就是它把这一套回调函数接口,从ajax操作扩展到了所有操作。也就是说,任何一个操作----不管是ajax操作还是本地操作,也不管是异步操作还是同步操作----都可以使用deferred对象的各种方法,指定回调函数。

 

 

Query规定,deferred对象有三种执行状态----未完成,已完成和已失败。如果执行状态是"已完成"resolved,deferred对象立刻调用done()方法指定的回调函数;如果执行状态是"已失败",调用fail()方法指定的回调函数;如果执行状态是"未完成",则继续等待,或者调用progress()方法指定的回调函数(jQuery1.7版本添加)。

dtd.resolve()的意思是,将dtd对象的执行状态从"未完成"改为"已完成",从而触发done()方法。类似的,还存在一个deferred.reject()方法,作用是将dtd对象的执行状态从"未完成"改为"已失败",从而触发fail()方法。

Promise::它代表了一种可能会长时间运行而且不一定必须完整的操作的结果。这种模式不会阻塞和等待长时间的操作完成,而是返回一个代表了承诺的(promised)结果的对象。

promise模式的使用需要恰当地设置promise对象,在对应的事件中调用状态转换函数,并且在最后返回promise对象。

主要函数:

0 0