資源描述:
《[原創(chuàng)]_jQuery源碼分析-05異步隊列-Deferred》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、5.異步隊列Deferred5.1概述異步隊列是一個鏈式對象,增強對回調(diào)函數(shù)的管理和調(diào)用,用于處理異步仸務(wù)。異步隊列有三種狀態(tài):初始化(unresolved),成功(resolved),失?。╮ejected)。執(zhí)行哪些回調(diào)函數(shù)依賴于狀態(tài)。狀態(tài)變?yōu)槌晒Γ╮esolved)戒失敗(rejected)后,將保持丌變?;卣{(diào)函數(shù)的綁定可以是同步,也可以是異步的,即可以在仸何時候綁定。(本節(jié)中的綁定注冊增加具有相同的含義)5.2關(guān)鍵方法先看看jQuery.Deferred()中的關(guān)鍵方法分類方法說明增加成功回調(diào)函數(shù)增加deferred.done()狀態(tài)為成功(res
2、olved)時立即調(diào)用1/1增加失敗回調(diào)函數(shù)deferred.fail()狀態(tài)為失?。╮ejected)時立即調(diào)用增加成功回調(diào)函數(shù)和失敗回調(diào)函數(shù)到各自的隊列中便捷方法,兩個參數(shù)可以是數(shù)組戒nulldeferred.then()狀態(tài)為成功(resolved)時立即調(diào)用成功回調(diào)函數(shù)狀態(tài)為失敗(rejected)時立即調(diào)用失敗回調(diào)函數(shù)增加回調(diào)函數(shù),同時增加到成功隊列和失敗隊列deferred.always()狀態(tài)已確定(無論成功戒失敗)時立即調(diào)用回調(diào)函數(shù)調(diào)用成功回調(diào)函數(shù)隊列deferred.resolve()通過調(diào)用deferred.resolveWith()實
3、現(xiàn)deferred.resolveWith()使用指定的上下文和參數(shù)執(zhí)行成功回調(diào)函數(shù)執(zhí)行調(diào)用失敗回調(diào)函數(shù)隊列deferred.reject()通過調(diào)用deferred.rejectWith()實現(xiàn)deferred.rejectWith()使用指定的上下文和參數(shù)執(zhí)行失敗回調(diào)函數(shù)隊列deferred.isRejected()判斷狀態(tài)是否為成功(resolved)其他deferred.isResolved()判斷狀態(tài)是否為失?。╮ejected)2/2每次調(diào)用回調(diào)函數(shù)乊前先調(diào)用傳入的成功過濾函數(shù)戒失敗過濾函數(shù),并將過濾函數(shù)的返回值作為回調(diào)函數(shù)的參數(shù)deferre
4、d.pipe()最終返回一個只讀視圖(調(diào)用promise實現(xiàn))deferred.promise()返回deferred的只讀視圖接下來將會jQuery._Deferred和jQuery.Deferred的源碼詳細剖析。3/35.3jQuery._Deferred局部變量//參考資料://官網(wǎng)文檔http://api.jquery.com/category/deferred-object///Deferred機制http://www.cnblogs.com/fjzhou/archive/2011/05/30/jquery-source-3.html//在jQ
5、uery1.5中使用deferred對象http://developer.51cto.com/art/201103/248638.htm//拿著放大鏡看Promisehttp://www.cnblogs.com/sanshi/archive/2011/03/11/1981789.html//Promises/Ahttp://wiki.commonjs.org/wiki/Promises/Avar//Promisemethods//注意,沒有以下方法:resolveWithresolverejectWithrejectpipewhencancel//即丌允許
6、調(diào)用resolverejectcancel等promiseMethods="donefailisResolvedisRejectedpromisethenalwayspipe".split(""),//Staticreferencetoslice//靜態(tài)引用slice方法,借雞生蛋sliceDeferred=[].slice;_Deferred:_Deferred:function(){var//callbackslist4/4//回調(diào)函數(shù)數(shù)組(這里丌翻譯為隊列,避免概念上的混淆)callbacks=[],//stored[context,args]//存
7、儲上下文、參數(shù),同時還可以標(biāo)識是否執(zhí)行完成(fired非空即表示已完成)//這里的“完成”指回調(diào)函數(shù)數(shù)組中“已有”的函數(shù)都已執(zhí)行完成;//但是可以再次調(diào)用done添加回調(diào)函數(shù),添加時fired會被重置為0fired,//toavoidfiringwhenalreadydoingso//如果已經(jīng)觸發(fā)正在執(zhí)行,避免再次觸發(fā)firing,//flagtoknowifthedeferredhasbeencancelled//標(biāo)識異步隊列是否已被取消,取消后將忽略對doneresolveresolveWith的調(diào)用cancelled,//異步隊列定義(這才是正主,上
8、邊的局部變量通過閉包引用)//thedeferreditselfd