ajax的傳統寫法:html
$.ajax({ url: "test.html", success: function(){ alert("哈哈,成功了!"); }, error:function(){ alert("出錯啦!"); } });
Jquery版本在1.5以前,返回的是XHR對象;當版本高於1.5以後,返回的是deferred對象,能夠使用 done 和 fail。jquery
因此新的寫法以下:ajax
$.ajax("test.html") .done(function(){ alert("哈哈,成功了!"); }) .fail(function(){ alert("出錯啦!"); });
能夠有多個done,按照順序執行。異步
$.ajax("test.html") .done(function(){ alert("哈哈,成功了!");} ) .fail(function(){ alert("出錯啦!"); } ) .done(function(){ alert("第二個回調函數!");} );
有時爲了省事,能夠把done()和fail()合在一塊兒寫,這就是then()方法。函數
$.ajax("test.html") .then(function(){ alert("哈哈,成功了!"); }, function(){ alert("出錯啦!"); } );
$.when
爲多個事件指定相同的回調:url
$.when($.ajax("test1.html"), $.ajax("test2.html")) .done(function(){ alert("哈哈,成功了!"); }) .fail(function(){ alert("出錯啦!"); });
將普通的異步函數改裝成deferred對象來使用$.when:spa
var wait = function(){ setTimeout(function(){ alert("執行完畢!"); },5000); };
在未改裝前使用無效:(緣由在於$.when()的參數只能是deferred對象).net
$.when(wait()) .done(function(){ alert("哈哈,成功了!"); }) .fail(function(){ alert("出錯啦!"); });
對wait()函數進行改裝:code
var wait = function(){ let df = $.Deferred(); // 新建一個deferred對象 setTimeout(function(){ alert("執行完畢!"); df.resolve(); // 將df對象的執行狀態從"未完成"改成"已完成",從而觸發done()方法。 // df.reject(); // 將df對象的執行狀態從"未完成"改成"已失敗",從而觸發fail()方法。 },5000); return df; // 如今返回的就是deferred對象了 };
而後就能夠使用了:htm
$.when(wait()) .done(function(){ alert("哈哈,成功了!"); }) .fail(function(){ alert("出錯啦!"); });
參考連接
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html