原始碼注釋
//由於deferred是基於promise規範,我們首先需要理清楚promises/a+是什麼。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)
它的規範內容大致如下(此翻譯內容引自這裡)
先用偽**來實現其規範內容
//promise規範生命週期普通的非同步**寫法。
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);
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 來進行異常處理。同時這是乙個立即執行函式,使得我們在載入框架...