jQuery Callbacks應用關鍵點

來源:互聯網
上載者:User

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()的能力。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.