首頁  >  文章  >  web前端  >  jQuery中的Deferred和promise 的差異_jquery

jQuery中的Deferred和promise 的差異_jquery

WBOY
WBOY原創
2016-05-16 15:06:391167瀏覽

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 物件的過程。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn