jQuery 中有一個(gè) Queue 隊(duì)列的接口,這個(gè)模塊沒(méi)有單獨(dú)拿出來(lái)作為一個(gè)章節(jié)是因?yàn)檫@個(gè)是內(nèi)部專門(mén)為動(dòng)畫(huà)服務(wù)的。Queue 隊(duì)列如同 data 數(shù)據(jù)緩存與 Deferred 異步模型一樣,都是 jQuery 庫(kù)的內(nèi)部實(shí)現(xiàn)的基礎(chǔ)設(shè)施。
Queue隊(duì)列
隊(duì)列是一種特殊的線性表,只允許在表的前端(隊(duì)頭)進(jìn)行刪除操作(出隊(duì)),在表的后端(隊(duì)尾)進(jìn)行插入操作(入隊(duì))。隊(duì)列的特點(diǎn)是先進(jìn)先出(FIFO-first in first out),即最先插入的元素最先被刪除。
為什么要引入隊(duì)列?
我們知道代碼的執(zhí)行流有異步與同步之分,例如:
var a = 1; setTimeout(function(){ a = 2; },0) alert(a) //1
我們一直習(xí)慣于“線性”地編寫(xiě)代碼邏輯,但是在 JavaScript 編程幾乎總是伴隨著異步操作:
setTimeout、CSS3Transition/Animation、ajax、dom 的繪制、postmessage、Web Database 等等,大量異步操作所帶來(lái)的回調(diào)函數(shù)會(huì)把我們的算法分解地支離破碎,之前我們說(shuō)過(guò)對(duì)于“異步+回調(diào)”的模式,怎么“拉平”異步操作使之跟同步一樣,因?yàn)楫惒讲僮鬟M(jìn)行流程控制的時(shí)候無(wú)非避免的要嵌套大量的回調(diào)邏輯,所以就會(huì)出現(xiàn) promises 約定了。
那么 jQuery 引入隊(duì)列其實(shí)從一個(gè)角度上可以認(rèn)為:允許一系列函數(shù)被異步地調(diào)用而不會(huì)阻塞程序。
看一個(gè)代碼段:
$("#Aaron").slideUp().fadeIn()
這是 jQuery 的一組動(dòng)畫(huà)鏈?zhǔn)叫蛄?,它的?nèi)部其實(shí)就是一組隊(duì)列 Queue,所以隊(duì)列和 Deferred 地位類似,是一個(gè)內(nèi)部使用的基礎(chǔ)設(shè)施。
Queue 函數(shù)允許直接操作這個(gè)鏈?zhǔn)秸{(diào)用的行為,同時(shí) Queue 可以指定隊(duì)列名稱獲得其他能力而不局限于 fx 隊(duì)列。
jQuery 提供了 2 組隊(duì)列操作的 API:
jQuery.queue/dequeue jQuery.fn.queue/dequeue
但是不同與普通隊(duì)列定義的是:
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書(shū)簽
舉報(bào)