2012-01-12 86 views
264

我一直在使用jQuery和AJAX幾周,現在我看到了兩種不同的方式來在調用完成後「繼續」腳本:success:.donejQuery.ajax處理繼續響應:「成功:」vs「.done」?

從從jQuery documentation我們得到的簡介:

.done():說明:添加處理程序當遞延對象是解決被調用。

成功:(.ajax()選項):如果請求成功,將被調用的函數。

因此,兩者都在AJAX調用完成/解決之後做了一些事情。我可以隨意使用其中一種嗎?有什麼區別,什麼時候使用一個而不是另一個?

回答

399

success一直是jQuery中成功回調的傳統名稱,定義爲ajax調用中的一個選項。但是,自從執行$.Deferreds以及更復雜的回調以來,done是實現成功回調的首選方式,因爲它可以在任何deferred上調用。

例如,成功:

$.ajax({ 
    url: '/', 
    success: function(data) {} 
}); 

例如,做到:

$.ajax({url: '/'}).done(function(data) {}); 

的好處約done是,$.ajax返回值現在是可以綁定到一個遞延承諾您應用程序中的任何其他位假設你想從幾個不同的地方進行這種Ajax調用。而不是將您的成功函數作爲ajax調用函數的選項傳遞,您可以讓函數本身返回$.ajax並將您的回調函數與donefail,then或任何其他函數綁定。請注意,always是一個回調,無論請求是成功還是失敗,都會運行。只有成功時纔會觸發done

例如:

function xhr_get(url) { 

    return $.ajax({ 
    url: url, 
    type: 'get', 
    dataType: 'json', 
    beforeSend: showLoadingImgFn 
    }) 
    .always(function() { 
    // remove loading image maybe 
    }) 
    .fail(function() { 
    // handle request failures 
    }); 

} 

xhr_get('/index').done(function(data) { 
    // do stuff with index data 
}); 

xhr_get('/id').done(function(data) { 
    // do stuff with id data 
}); 

的這可維護性方面的一個重要的好處是,你已經包裹在一個應用程序特定功能的AJAX機制。如果您決定需要調用$.ajax來調用以後的不同操作,或者使用不同的Ajax方法,或者您不再使用jQuery,則只需更改xhr_get定義(確保返回承諾或至少返回done方法,在上面的例子中)。整個應用中的所有其他參考可以保持不變。

還有更多(冷得多)的事情你可以做$.Deferred,其中之一是使用pipe觸發由服務器報告的錯誤失敗,即使$.ajax請求本身成功。例如:

function xhr_get(url) { 

    return $.ajax({ 
    url: url, 
    type: 'get', 
    dataType: 'json' 
    }) 
    .pipe(function(data) { 
    return data.responseCode != 200 ? 
     $.Deferred().reject(data) : 
     data; 
    }) 
    .fail(function(data) { 
    if (data.responseCode) 
     console.log(data.responseCode); 
    }); 
} 

xhr_get('/index').done(function(data) { 
    // will not run if json returned from ajax has responseCode other than 200 
}); 

在這裏閱讀更多關於$.Deferredhttp://api.jquery.com/category/deferred-object/

注意:在jQuery 1.8,pipe一直贊成以完全相同的方式使用then的棄用。

+2

我不知道如何定義'success:'/'.done()'的相互作用。例如。是'成功':這些日子剛剛實現爲第一個'.done()'? – 2012-01-12 19:15:53

+5

你是說如果你在ajax調用中同時擁有'success:'和'.done'?好問題。由於所有其他回調函數都是按照它們綁定的順序調用的,所以我的猜測是肯定的,「成功」只是先調用。 – glortho 2012-01-12 19:24:44

+1

是的,那的確會出現這種情況:http://jsfiddle.net/9L7dD/ – Adam 2014-04-19 14:35:28

2

如果你需要在你的ajax中使用async: false,你應該使用success而不是.done。否則你最好使用.done。 這是jQuery official site

對於jQuery 1.8,使用異步的:假與jqXHR($ .Deferred)已被棄用;你必須使用成功/錯誤/完整呼選項,而不是的jqXHR對象,如jqXHR.done()的相應方法。