jQuery: Callbacks
jQuery 中提供了一個Callback的工具類Callbacks,它提供了一個Callback Chain。使用它可以在一個chain上來執行相關操作。它也是jQuery中的ajax, Deferred的基礎。我們也可以使用它來構建需要異步執行的組件等。
Callbacks API說明
構造器
jQuery.Callbacks(flags) 創建Callbacks對象。
Callbacks對象裏包含了一個callback function的數組(也稱為 callback chain)。
method說明
add(function|functions) : 將一個或多個
remove(function|functions) :從callback chain中移除指定的callback function。
fire(arguments):觸發callback chain。在執行chain中的每一個callbakc function時,參數都是一樣的。
fireWith(context,arguments): 在context下執行callback chain。
disable(): 禁用Callbacks。其實是將chain設置為undefined。所以在禁用後,
empty():只是將chain內容清空。
構造器參數
flags:
·unique chain中的funcation是不能重復的。如果重復添加時,是添加不了的。生效於添加階段(也就是在add函數中使用)。
·once 是整個鏈中的每一個callback function都要被執行一次,並且只執行一次。
·memory 保留上一次fire時的參數,並記錄上一次fire時執行到第n個callback function。在下一次fire時,先將上一次未執行的(包括上一次之後,又新加的
·stopOnFalse 執行一個callback時判斷執行結果是否為false,如果是false的話就停止不在執行。
重要流程
Add一個函數的流程:
1)如果有unique標誌,判斷要添加的是否存在,只在不存在時添加到chain中。
2)如果沒有unique標誌,代表可以重復。直接添加到chain中。
Fire的流程:
1)設置context
如果沒有指定context,那麽context值是 Callbacks對象。
2)將chain中未執行的functions執行一遍。在此過程中,每執行完一個就會基於stopOnFalse來進行判斷(如果設置的話)
3)後置處理
如果Callbacks可以多次執行:
如果還有沒有執行的參數,再次執行。
否則:(只能執行一次)
如果被stopOnFalse了,執行disable()。
否則:執行empty
Demo
<script src="https://code.jquery.com/jquery-1.7.2.js" integrity="sha256-FxfqH96M63WENBok78hchTCDxmChGFlo+/lFIPcZPeI=" crossorigin="anonymous"></script> <script type="text/javascript"> $(function(){ function fn1(value){ console.log(arguments.length,value); }
function fn2(value){ return "fn2, " + value; }
function fn3(value){ fn1(fn2(value)); } debugger; var callbacks = jQuery.Callbacks("once memory"); callbacks.add(fn1,fn2,fn3); callbacks.fire("hello_0") console.log("--------1-------") callbacks.add([fn1,fn3]); callbacks.add(fn2); callbacks.add(fn3); callbacks.fire("hello_1"); });
</script> |
jQuery: Callbacks