Deferred和Promise之間有什麼差別呢?
promise
一個promise就是一個由 非同步函數傳回的物件 。當你想要自己寫一個這樣的函數時你需要使用一個deferred。
var promise = $.ajax({ url: "/myServerScript" }); promise.done(mySuccessFunction); promise.fail(myErrorFunction); var promise = $.ajax({ url: "/myServerScript" }); promise.then(mySuccessFunction,myErrorFunction);
使用Promises的好處有以下幾點:
你可以多次呼叫done()和fail()函數,並使用不同的回呼函數。或許你的一個回呼函數用來停止動畫,一個用來發起一個新的AJAX請求,一個用來將接受到的資料展示給使用者。
var promise = $.ajax({ url: "/myServerScript" }); promise.done(myStopAnimationFunction); promise.done(myOtherAjaxFunction); promise.done(myShowInfoFunction); promise.fail(myErrorFunction);
即使在AJAX呼叫完成之後,你依然可以呼叫done()和fail()函數,而且回呼函數可以立即執行。不同的狀態之間並不會發生變數混亂。當一個AJAX呼叫結束時,它保持了一個成功狀態或失敗狀態,這個狀態不會改變。
你可以合併promises。有時你需要同時進行兩個AJAX請求並且想要在兩個AJAX請求都成功時呼叫一個函數。為了完成這個任務,你需要使用一個新的$.when()函數:
var promise1 = $.ajax("/myServerScript1"); var promise2 = $.ajax("/myServerScript2"); $.when(promise1, promise2).done(function(xhrObject1, xhrObject2) { // 处理两个XHR对象 });
deferred
簡單說,deferred物件就是jQuery的回呼函數解決方案。在英文中,defer的意思是”延遲”,所以deferred物件的意思就是”延遲”到未來某個點再執行。
一個 deferred物件 能做的和一個promise物件差不多,但是它有兩個函數來觸發 done()和fail()函數 。
一個deferred物件擁有一個resolve()函數來處理一個成功的結果並執行與done()相關的函數。 reject()函數則用來處理失敗的結果並執行與fail()相關的函數。
你可以給resolve()和reject()函數都提供參數,然後它們都會傳遞給與done()和fail()相關的回呼函數。
總結
jQuery 的ajax 就是回傳一個promise 對象,裡面含有done(), fail()方法; deferred 是實作傳回這個promise 物件的過程。