memory:保持以前的值,將添加到這個(gè)列表的后面的最新的值立即執(zhí)行調(diào)用任何回調(diào) (像一個(gè)遞延 Deferred)。
回調(diào)函數(shù)是從異步隊(duì)列Deferred分離出來的,所以很多的接口設(shè)計(jì)都是為了契合Deferred接口,memory用的很多,這個(gè)緩存的設(shè)計(jì)這里提及一下
主要是用來實(shí)現(xiàn)deferred的異步收集與pipe管道風(fēng)格的數(shù)據(jù)傳遞的,具體在Deferred有詳解,這里大概了解下作用范圍。
memory這個(gè)有點(diǎn)不好理解,我們還是通過列子說明下,看下面的代碼:
var cbs = Callbacks('once'); cbs.add(fn1); cbs.fire('foo'); cbs.fire('foo'); function fn1(val) { console.log('fn1 says ' + val); } function fn2(val) { console.log('fn2 says ' + val); } function fn3(val) { console.log('fn3 says ' + val); } var cbs = $.Callbacks('memory'); cbs.add(fn1); cbs.fire('foo'); console.log('..........') cbs.add(fn2); cbs.fire('bar'); console.log('..........') cbs.add(fn3); cbs.fire('aaron');
結(jié)果可以看出,我們?cè)趫?zhí)行cbs.add(fn2);的時(shí)候,此時(shí)除了把fn2添加到了回調(diào)隊(duì)列之外而且還立刻執(zhí)行了這個(gè)方法,唯一的區(qū)別就是,參數(shù)是用的之前的。所以解釋就叫“保持以前的值”。
fn1 says foo .......... fn2 says foo fn1 says bar fn2 says bar .......... fn3 says bar fn1 says aaron fn2 says aaron fn3 says aaron
所以這個(gè)memory
設(shè)計(jì)需要解決的問題就是:
1:如何取到上一個(gè)參數(shù)
2:add后如何執(zhí)行
看看我們實(shí)現(xiàn)的代碼:
function Callbacks(options) { var list = []; var self; var firingStart; var memory; function _fire(data) { memory = options === 'memory' && data; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for (; list && firingIndex < firingLength; firingIndex++) { list[firingIndex](data) } } self = { add: function(fn) { var start = list.length; list.push(fn) if (memory) { firingStart = start; //獲取最后一值 _fire(memory); } }, fire: function(args) { if (list) { _fire(args) } } } return self; }
首先add之后要能觸發(fā)fire的動(dòng)作,所以我們把fire作為內(nèi)部的一個(gè)私有方法實(shí)現(xiàn)_fire,比較合邏輯,這樣外部的fire只是一個(gè)門面方法的調(diào)用。
私有變量memory緩存這上一個(gè)參數(shù)的屬性,我們靠firingStart用來定位最后通過add增加的回調(diào)數(shù)據(jù)的索引。在遍歷的時(shí)候直接通過firingStart的起始索引定位,然后傳遞memory的參數(shù),而且實(shí)現(xiàn)這種“保持以前的值”的設(shè)計(jì)。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)