最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

章節(jié)
問答
課簽
筆記
評(píng)論
占位
占位

Ajax的deferred實(shí)現(xiàn)

在異步機(jī)制這章我們詳細(xì)的分析了 deferred 的設(shè)計(jì),其中提供了 deferred.promise 方法就是把普通對(duì)象轉(zhuǎn)化成 deferred 對(duì)象了,ajax 就是把 deferred 對(duì)象給摻進(jìn)去可以讓整個(gè) Ajax 方法變成了一個(gè) deferred 對(duì)象,在Ajax方法中返回的是 jqXHR 一個(gè)包裝對(duì)象,在這個(gè)對(duì)象里面混入了所有實(shí)現(xiàn)方法。

ajax: function(url, options) {
    var jqXHR = {} //ajax對(duì)象
    deferred = jQuery.Deferred()
    //轉(zhuǎn)成deferred對(duì)象
    deferred.promise(jqXHR).complete = completeDeferred.add
    return jqXHR
}

jQuery.ajax 的版本迭代:

  • 從 jQuery 1.5 開始,$.ajax() 返回 XMLHttpRequest(jqXHR)對(duì)象,該對(duì)象是瀏覽器的原生的 XMLHttpRequest 對(duì)象的一個(gè)超集。例如,它包含 responseText 和 responseXML 屬性,以及一個(gè) getResponseHeader() 方法。當(dāng)傳輸機(jī)制不是 XMLHttpRequest 時(shí)(例如,一個(gè) JSONP 請求腳本,返回一個(gè)腳本 tag 時(shí)),jqXHR 對(duì)象盡可能的模擬原生的 XHR 功能。
  • 從 jQuery 1.5.1 開始, jqXHR 對(duì)象還包含了overrideMimeType 方法 (它在 jQuery 1.4.x 中是有效的,但是在 jQuery 1.5 中暫時(shí)的被移除)。.overrideMimeType() 方法可能用在 beforeSend() 的回調(diào)函數(shù)中,例如,修改響應(yīng)的 Content-Type 信息頭:
  • 為了讓回調(diào)函數(shù)的名字統(tǒng)一,便于在$.ajax()中使用。jqXHR也提供.error() .success()和.complete()方法。這些方法都帶有一個(gè)參數(shù),該參數(shù)是一個(gè)函數(shù),此函數(shù)在 $.ajax()請求結(jié)束時(shí)被調(diào)用,并且這個(gè)函數(shù)接收的參數(shù),與調(diào)用 $.ajax()函數(shù)時(shí)的參數(shù)是一致。這將允許你在一次請求時(shí),對(duì)多個(gè)回調(diào)函數(shù)進(jìn)行賦值,甚至允許你在請求已經(jīng)完成后,對(duì)回調(diào)函數(shù)進(jìn)行賦值(如果該請求已經(jīng)完成,則回調(diào)函數(shù)會(huì)被立刻調(diào)用)。

為了向后兼容 XMLHttpRequest ,jqXHR 對(duì)象將公開下列屬性和方法:

readyState
status
statusText
responseXML and/or responseText 當(dāng)?shù)讓拥恼埱蠓謩e作出XML和/或文本響應(yīng)
setRequestHeader(name, value) 從標(biāo)準(zhǔn)出發(fā),通過替換舊的值為新的值,而不是替換的新值到舊值
getAllResponseHeaders()
getResponseHeader()
abort()


為了實(shí)現(xiàn)以上這些功能,jQuery 在對(duì) jqXHR 做2個(gè)處理:

  1. 異步隊(duì)列 deferred
  2. 回調(diào)隊(duì)列 Callbacks
// Deferreds
deferred = jQuery.Deferred(),
//所有的回調(diào)隊(duì)列,不管任何時(shí)候增加的回調(diào)保證只觸發(fā)一次
completeDeferred = jQuery.Callbacks("once memory"),

給 jqXHR 擴(kuò)充添加 promise 的屬性和方法,然后添加 complete 方法,這里用的是回調(diào)列表的 add 方法(即添加回調(diào))

deferred.promise(jqXHR).complete = completeDeferred.add;

此時(shí)的 jqXHR 就具有了 promise 的一些特性了與 callback 的回調(diào)列隊(duì)了,當(dāng)然這里有個(gè)重點(diǎn),返回了一個(gè)只讀的 deferred 對(duì)象,如果返回完整的 deferred 對(duì)象,那么外部程序就能隨意的觸發(fā) deferred 對(duì)象的回調(diào)函數(shù),很有可能在 AJAX 請求結(jié)束前就觸發(fā)了回調(diào)函數(shù)(resolve),這就是與 AJAX 本身的邏輯相違背了。所以為了避免不經(jīng)意間改變?nèi)蝿?wù)的內(nèi)部流程,我們應(yīng)該只返回 deferred 的只讀版本 deferred.promise(),然后把對(duì)應(yīng)的 done 與 fail 改成別名 success 與 error。

jqXHR.success = jqXHR.done;
jqXHR.error   = jqXHR.fail

 

我們還需要把用戶自定的內(nèi)部回調(diào)函數(shù)給注冊到 jqXHR 對(duì)象上。

// 增加回調(diào)隊(duì)列
for (i in {
    success  : 1,
    error    : 1,
    complete : 1
}) {
    /**
     * 把參數(shù)的回調(diào)函數(shù)注冊到內(nèi)部jqXHR對(duì)象上,實(shí)現(xiàn)統(tǒng)一調(diào)用
     * 給ajax對(duì)象注冊 回調(diào)函數(shù)add
     * deferred返回complete,error外部捕獲
     */
    jqXHR[i](s[i]);
}

通過一個(gè) for 循環(huán)把對(duì)應(yīng)的方法都執(zhí)行了,具體就是這幾個(gè):

  1. jqXHR.success(s.success)  -> jqXHR.done -> jQuery.Callbacks("once memory")
  2. jqXHR.error(s.error)  -> jqXHR.fail -> jQuery.Callbacks("once memory")
  3. jqXHR.complete(s.complete) -> jQuery.Callbacks("once memory").add(s.success

 

我們參考右邊 Ajax 的模擬實(shí)現(xiàn)代碼。

 

任務(wù)

?不會(huì)了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗(yàn)證,完成請求

由于請求次數(shù)過多,請先驗(yàn)證,完成再次請求

加群二維碼

打開微信掃碼自動(dòng)綁定

您還未綁定服務(wù)號(hào)

綁定后可得到

  • · 粉絲專屬優(yōu)惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復(fù)提醒
  • · 賬號(hào)支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關(guān)注公眾號(hào)
關(guān)注后,及時(shí)獲悉本課程動(dòng)態(tài)

舉報(bào)

0/150
提交
取消
全部 精華 我要發(fā)布
全部 我要發(fā)布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費(fèi)2個(gè)積分

你的積分不足,無法發(fā)表

為什么扣積分?

本次提問將花費(fèi)2個(gè)積分

繼續(xù)發(fā)表請點(diǎn)擊 "確定"

為什么扣積分?