在jquery1.5之後的版本中,加入了一個deferred對象,也就是延遲對象,用來處理未來某一時間點發生的回調函數。同時,還改寫了ajax方法,現在的ajax方法返回的是一個deferred對象。 那就來看看deferred對象的用法。 1.ajax的鏈式回調 還可以同時寫多個回調,會按照順序依 ...
在jquery1.5之後的版本中,加入了一個deferred對象,也就是延遲對象,用來處理未來某一時間點發生的回調函數。同時,還改寫了ajax方法,現在的ajax方法返回的是一個deferred對象。
那就來看看deferred對象的用法。
1.ajax的鏈式回調
// ajax方法返回的是一個deferred對象,可以直接使用鏈式寫法 $.ajax('test.json').done(function(resp){ // done 相當於success回調,其中預設的參數為success回調的參數 alert('success'); }).fail(function(){ // fail 相當於error回調 alert('error'); });
還可以同時寫多個回調,會按照順序依次執行
$.ajax('test.json').done(function(resp){ // done 相當於success回調,其中預設的參數為success回調的參數 alert('success'); }).done(function(){ // do something... }).done(function(){ // do something... });
deferred對象還有一個then方法,其實它是一個整合done和fail的方法,它接受一到兩個參數,如果有兩個參數,那麼第一個就是done方法的回調函數,第二個是fail方法的回調函數。如果只有一個參數,那就是done方法的回調函數。
var success = function(){ alert('success'); }; var error = function(){ alert('error'); }; // 兩個參數 $.ajax('test.json').then(success, error); // 一個參數 $.ajax('test.json').then(success);
jQuery還提供了一個$.when(deferreds)的方法來執行一個或多個延遲對象的回調函數,當它的參數是延遲對象時,它會在所有延遲對象代表的非同步執行完後再執行相應的回調函數
$.when($.ajax('test.json'), $.ajax('demo.json'))
.done(function(){ alert('success'); }).fail(function(){ alert('error'); });
很好理解,只有當所有非同步都成功時,才會執行done方法中的回調,否則會執行fail方法中的回調,同樣好理解的是的done方法中回調函數的預設參數數量則和when方法參數數量相同。
而如果when方法中傳入的只是普通對象,不是deferred對象時,會立即執行done方法中的回調,回調函數的預設參數為傳入when方法的對象本身。
// 當傳入when方法的參數只是普通對象時 $.when({test: 'test'}).done(function(resp){ console.log(resp.test); // 'test' }).fail(function(){ // 由於傳入的對象不是deferred對象,那麼就不會調用fail中的回調了 })
當你需要兩個甚至更多的非同步結束後才調用回調函數,同時這些非同步ajax可能還需要修改傳輸方式type或者傳數據data時,代碼就顯得很亂,可讀性很差。
所以就可以對ajax進行再次封裝,提高代碼可讀性
var ajax = function(url, type, param){ return $.ajax({ url: url, type: type, data: param || {} }); }; ajax('test.json').done(function(resp){ alert('success'); }).fail(function(){ alert('error'); });