從設(shè)計(jì)的層面上來考下,這種事件組合的方式是如何實(shí)現(xiàn)?有什么優(yōu)勢(shì)?
設(shè)計(jì)一:
tAjax({
url: "php.html",
complete: function(data) {
console.log(data)
}
})
如果要實(shí)現(xiàn)這種接口調(diào)用那么我們就需要封裝下代碼,把回調(diào)通過實(shí)參傳遞。
var tAjax = function(config) {
//參考右圖設(shè)計(jì)一
}
這樣設(shè)計(jì)可以看做類似工廠模式的封裝,好處不用多說在工廠模式里面包含了對(duì)象的創(chuàng)建等必要的邏輯,客戶端根據(jù)傳參選擇動(dòng)態(tài)的實(shí)例化相對(duì)的處理,對(duì)于客戶端來去除了具體的依賴,當(dāng)然 tAjax 你也可以看作一個(gè)外觀模式提供的接口,其實(shí)就是隱藏了具體的復(fù)雜邏輯,提供一個(gè)簡(jiǎn)單的接口,從而降低耦合。
設(shè)計(jì)二:
tAjax({
url: "php.html",
complete: function(data) {
console.log(data)
}
}).done(function(data){
console.log(data)
})
在之前加入了一個(gè) done 鏈?zhǔn)教幚?,?dāng)然這里 done,其實(shí)是 deferred 的一個(gè)成功處理通知,如果之前沒有接觸,大家去了解一下關(guān)于 deferred 的概念,我們知道 jQuery 實(shí)現(xiàn)了鏈?zhǔn)剑瑢?shí)現(xiàn)的原理無法就是返回本身對(duì)象的引用。
var ajax = tAjax({
url: "php.html",
complete: function(data) {
console.log(data)
}
})
ajax.done(function(){
//.........
})
以上是分離的情況下,如果要合并成一條鏈?zhǔn)教幚?,只要在上一個(gè)方法中返回 this 即可。
var tAjax = function(config) {
///參考右圖設(shè)計(jì)二
return {
done: function(ourfn) {
doneFn = ourfn;
}
}
}
我們返回了一個(gè) done 對(duì)象,這里一樣要是對(duì)象,因?yàn)殒準(zhǔn)降脑蛭覀兛赐獠恐付藘?nèi)部的 done,從而把外部函數(shù)給引用到內(nèi)部的 doneFn 上緩存起來 xhr.staturs 成功后一起執(zhí)行,當(dāng)然這種設(shè)計(jì)是有問題的,如果在 done 之后我再鏈?zhǔn)骄涂隙ú恍?,因?yàn)閷?duì)象的引用錯(cuò)了,那么 jQuery 是如何處理?
設(shè)計(jì)三:提供 document 對(duì)象的全局處理
$(document).ajaxComplete(function() {
console.log('ajax請(qǐng)求成功')
})
tAjax({
url: "php.html",
complete: function(data) {
console.log(data)
}
}).done(function(data){
console.log(data)
})
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)