jQuery Callbacks應用關鍵點
Callbacks是jQuery 1.7引入的方法,用於管理一系列使用相同參數的回呼函數。所有回呼函數(以下簡稱回調)儲存在一個數組中,可以重複調用。其本質相當於一個回呼函數列(List),因此可以做添加、刪除、清空回呼函數等操作。
產生回調列(Callbacks)
var callbacks = $.Callbacks();
回調執行順序
回調儲存在數組中,然後通過for迴圈遍曆,所以列中的回調按照被添加的順序依次執行,最後添加的一般最後執行。
// Fire the items on the listvar foo = function( value ) { console.log( "foo:" + value );};// Add another function to the listvar bar = function( value ){ console.log( "bar:" + value );};var callbacks = $.Callbacks();callbacks.add( foo );callbacks.add( bar);callbacks.fire("hello"); // output: foo: hello// output: bar: hello
唯一例外的情況是如果標記是memory,如果之前fire()被調用過,那麼新的回調被add()添加之後會立刻使用前一個fire的參數執行一遍。但add()之前被fire()調用過的回調,如果沒有使用fire()或fireWith(),不會馬上再執行一遍。
四個標記:once, memory, unique, stopOnFalse
Once:列中的每一個回調最多執行一遍,執行完成之後,回呼函數列被清空。Memory:記住前一次fire()的參數,新回調一旦被添加就立即使用上一次的參數執行一遍(之前添加的回調不執行)。Unique:同一個回調不能重複添加。stopOnFalse:如果某個回調如果返回false,那麼後面的回調都不會再執行。
標記設定方式舉例:
var callbacks = $.Callbacks("once memory");
其它關鍵點調用callbacks.disable()之後,callbacks無法再被enabled
調用disable()之後,回呼函數列就被清空了,此時使用fire或fireWith都不會有任何響應。因此,Callbacks沒有提供enable方法,因為所有回調已經被清空了,沒有再enable的必要。
回呼函數中調用Callbacks的fire()或fireWith()
有一種情況是在回調中又調用了callbacks的fire()或fireWith(),這種情況該怎麼辦?jQuery是這樣做的:在回調中使用fire()或fireWith(),callbacks只是儲存了fire()或fireWith()的參數,並沒有立即執行列中的回調。只有當callbacks中的所有回調執行完之後,新的參數才會被callbacks中的回調利用。
function fn1( value ){ console.log( value ); if (value == "bar!") return false; callbacks.fire("bar!");} function fn2( value ){ console.log( "fn2 says: " + value);} var callbacks =$.Callbacks("stopOnFalse"); callbacks.add( fn1 );callbacks.add( fn2 ); // Outputs: foo!// Outputs: fn2 says:foo!// Outputs: bar!callbacks.fire("foo!" );
callbacks.lock()
回調列被鎖死,再調用callbacks.fire()或callbacks.fireWith()都將失效。
如果是在回調中調用了callbacks.lock(),則有一點需要注意:
callbacks有memory標記:當前fire()或fireWith()方法中沒有執行的回調會繼續執行,但回調中的callbacks.fire()和callbacks.fireWith()都不會再起作用。callbacks無memory標記:所有回調全部被清空,也就是說後面的回調都不再執行。
奇怪的是Callbacks沒有提供unlock方法,也就是說,一旦被locked,Callbacks就永久失去了調用fire()或fireWith()的能力。