Zepto原始碼分析 deferred模組

2022-07-12 07:33:09 字數 3473 閱讀 8016

原始碼注釋

//

zepto.js

//(c) 2010-2015 thomas fuchs

may be freely distributed under the mit license.

////

some code (c) 2005, 2013 jquery foundation, inc. and other contributors

;(function($)), "

resolved"],

[ "reject

", "

fail

", $.callbacks(), "

rejected"],

[ "notify

", "

progress

", $.callbacks() ]

],state = "

pending

", //

promise初始狀態

//promise物件,promise和deferred的區別是:

/*promise只包含執行階段的方法always(),then(),done(),fail(),progress()及輔助方法state()、promise()等。

deferred則在繼承promise的基礎上,增加切換狀態的方法,resolve()/resolvewith(),reject()/rejectwith(),notify()/notifywith()

*///

所以稱promise是deferred的唯讀副本

promise =

*/state: function() ,

/*** 成功/失敗狀態的 **呼叫

* @returns

*/always: function() ,

/***

* @returns promise物件

*/then: function(

/*fndone [, fnfailed [, fnprogress]]

*/)

else

})})

fns = null

}).promise()

},/**

* 返回obj的promise物件

* @param obj

* @returns

*/promise: function(obj)

},//內部封裝deferred物件

deferred ={}

//給deferred新增切換狀態方法

$.each(tuples, function(i, tuple), tuples[i^1][2].disable, tuples[2][2].lock

) }

//新增切換狀態方法 resolve()/resolvewith(),reject()/rejectwith(),notify()/notifywith()

deferred[tuple[0]] =function()

deferred[tuple[

0] + "

with

"] =list.firewith

})//deferred繼承promise的執行方法

promise.promise(deferred)

//傳遞了引數func,執行

if(func) func.call(deferred, deferred)

//返回deferred物件

return

deferred

} /**

** 主要用於多非同步佇列處理。

多非同步佇列都成功,執行成功方法,乙個失敗,執行失敗方法

也可以傳非非同步佇列物件

* @param sub

* @returns

*/$.when =function(sub) else

if (!(--remain)) }}

//長度大於1,

if (len > 1

) else}}

//都為非def,比如無引數,或者所有子佇列全為非def,直接通知成功,進入成功函式列表

if (!remain) deferred.resolvewith(resolvecontexts, resolvevalues)

return

deferred.promise()

} $.deferred =deferred

})(zepto)

由於deferred是基於promise規範,我們首先需要理清楚promises/a+是什麼。

它的規範內容大致如下(此翻譯內容引自這裡) 

先用偽**來實現其規範內容

//

普通的非同步**寫法。

function fa()

catch

(e) }

function fa2()

//下面採用

promise規範來改寫

//初始化: 等待狀態 pending

var promise =

},//必須申明的then方法

then:function(fulfilledfn,rejectedfn),

//當狀態切換fulfilled時執行

done: function(),

//當狀態切換rejected時執行

fail:function(),

//切換為已完成狀態

tofulfilled:function(),

//切換為已拒絕狀態

torejected:function()

}//將函式包裝成promise物件,並註冊完成、拒絕鏈方法

//通過then

promise.promise(fa).then(fa1,efa1).then(fa2,efa2);

//假定fb裡還呼叫了另乙個非同步fb,

//之前fa的非同步**執行到fb方法

var pa =promise.promise(fa).then(fa,efa).then(fb,efb);

//再掛上fb的非同步**

pa.then(fb).then(fb1,efb1).then(fb2,efb2);

promise規範生命週期

deferred用法

deferred生命週期

deferred設計

zepto原始碼分析

首先我們看一下如下 如何給乙個陣列物件新增其他方法 var arr 1,2,3 arr.proto concat array.prototype.concat,push array.prototype.push arr.push 4 1,2,3,4 arr.addclass addclass 我們修...

zepto原始碼結構

在引入zepto檔案以後,我們就可以使用zepto的方法,例如 selector 這是因為下面的 window.zepto zepto window.undefined window.zepto 複製 在window物件上,我們繫結了zepto,zepto這是乙個立即執行函式。如果 不存在,就把wi...

Zepto原始碼之ie模組

function catch e catch e 這段 的主要作用是改寫 getcomputedstyle 方法。主要是為了 zepto 在不同的瀏覽器下,可以進行相同的操作。通過檢視 我們可以看出主要使用的方法是利用 try catch 來進行異常處理。同時這是乙個立即執行函式,使得我們在載入框架...