在開發的過程,常常會遇到一些耗時間的操做,好比ajax讀取服務器數據(異步操做),遍歷一個很大的數組(同步操做)。無論是異步操做,仍是同步操做,總之就是不能當即獲得結果,JS是單線程語音,不能當即獲得結果,便會一直等待(阻塞)。html
通常的作法就是用回調函數(callback),即事先定義好一個函數,JS引擎不等待這些耗時的操做,而是繼續執行下面的代碼,等這些耗時操做結束後,回來執行事先定義好的那個函數。以下面的ajax代碼:ajax
$.ajax({ url: "test.html", success: function(){ console.log("success"); }, error: function(){ console.log("error"); } });
但這樣寫不夠強大靈活,也很囉嗦。爲此,jQuery1.5版本引入Deferred功能,爲處理事件回調提供了更增強大而靈活的編程模式。編程
$.ajax("test.html") .done( function(){ console.log("success"); } ) .fail( function(){ console.log("error"); } );
不就是鏈式調用嘛,有何優勢?數組
優勢一:能夠清晰指定多個回調函數服務器
function fnA(){...} function fnB(){...} $.ajax("test.html").done(fnA).done(fnB);
試想一下,若是用之前的編程模式,只能這麼寫:異步
function fnA(){...} function fnB(){...} $.ajax({ url: "test.html", success: function(){ fnA(); fnB(); } });
優勢二:爲多個操做指定回調函數函數
$.when($.ajax("test1.html"), $.ajax("test2.html")) .done(function(){console.log("success");}) .fail(function(){console.log("error");});
用傳統的編程模式,只能重複寫success,error等回調了。url