您的位置:首页 > Web前端 > JQuery

jQuery $.Deferred()对象学习笔记

2015-10-16 11:01 591 查看

###背景 - 为回调函数而生 jQuery 1.5.0版本之前,回调函数的功能非常弱,deferred对象就是jQuery的回调函数解决方案。 ###使用场景 ####1.ajax链式用法 jQuery中ajax的传统使用方式: ``` python $.ajax({ url: 'deferred.html', success: function(){ // 成功 }, error: function(){ // 失败 } }); ``` 如上,$.ajax()接受一个对象参数,包含指定操作成功后返回的success方法和指定方法操作失败后的error回调。 **`$.ajax()操作完成后,jQuery 1.5版本之前返回 的是XHR对象,无法进行链式操作。而1.5版本之后,返回的deferred对象,可以进行链式操作`** ``` python $.ajax('deferred.html') .done(function(){ // 成功 }) .fail(function(){ // 失败 }) .done(function(){ // 第二个回调函数 }); ``` 链式写法可大大增加代码的可读性。 ####2.同一操作可以添加多个回调函数 见上面代码 ####3.多个操作指定同一回调 通常,项目中会有如下需求,当两个或两个操作都执行成功时,才执行一个函数,这时使用deferred对象就可以了。 这里涉及一个新的方法$.when() ``` python $.when(deferred对象, deferred对象, ...) .done(function(){ // 成功 }) .fail(function(){ // 失败 }); ``` ####4.普通操作的回调函数接口 deferred对象应用广泛,这一套回调函数接口既可用于ajax操作又可用于本地操作,异步同步皆可。 `deferred对象有三种执行状态--未完成、已完成、已失败` `已完成(resolved),deferred对象立即调用done()方法指定的函数 已失败,调用fail()方法指定的函数 未完成,则继续等待,或调用progress()方法指定的函数` deferred.reject()方法用于将执行状态从未完成改为已失败,触发fail()方法 deferred.promise()方法,在原来的deferred对象上返回另一个deferred对象,这个对象只开放与改变执行状态无关的方法(如done()和fail()),而不开放与改变执行状态有关的方法(如resolve()方法和reject()方法),从而使执行状态不可更改 很好的demo: ``` python var wait = function(){ var deferred = $.Deferred(), task = function(){ alert('执行完毕!'); deferred.resolved(); } settimeout(task, 5000); return deferred.promise(); }; $.when(wait()) .done(function(){ // 成功 }) .fail(function(){ // 失败 }); ``` ####5.then方法 then方法是done和fail的结合体,第一个参数是done的回调,第二个参数是fail的回调(非必须) ```python $.when($.ajax( "/main.php" )) .then(successFunc, failureFunc ); ``` ###参考链接: jQuery的deferred对象详解 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html jquery deffered promise http://segmentfault.com/a/1190000000523676 使用 jQuery Deferred 和 Promise 创建响应式应用程序 http://www.cnblogs.com/lhb25/archive/2013/03/05/jquery-deferred-promise.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: