關於Callbacks http://www.cnblogs.com/aaronjs/p/3342344.html
$.Callbacks()
的內部提供了jQuery的$.ajax()
和 $.Deferred()
基本功能組件
在針對ajax處理中,用的最多的就是once memory的組合
/** * 所有的回調隊列,不管任何時候增加的回調保證只觸發一次 * @type {[type]} */ completeDeferred = jQuery.Callbacks("once memory"),
在Deferred中的done與fail
var tuples = [ // action, add listener, listener list, final state ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")] ],
once,memory
確保這個回調列表只執行( .fire() )一次(像一個遞延 Deferred).
保持以前的值,將添加到這個列表的后面的最新的值立即執行調用任何回調 (像一個遞延 Deferred).
once的時候只允許add一次,在觸發fire之后就會理清掉list
disable: function() { list = stack = memory = undefined; return this; },
所以后續的操作都是無用的
memory方法就比較特殊了, 有點類似deferred的感覺,就是能夠等全部的add都加載完畢后才觸發
memory的實現思路就是在add的時候直接觸發fire,從而再次執行list列表
firingStart = start;
fire(memory);
因為memory是基於在當前add的時候出發fire保持以前的值,將添加到這個列表的后面的最新的值立即執行調用任何回調
那么就只會遞歸出包括當前以前的所有隊列
var callbacks = $.Callbacks("memory"); callbacks.add( fn1 ); callbacks.fire( "1" ); callbacks.add( fn1 ); callbacks.fire( "2" ); callbacks.add( fn1 ); callbacks.fire( "3" ); callbacks.add( fn1 ); callbacks.fire( "4" );
fn1 says: 1 fn1 says: 1 fn1 says: 2 fn1 says: 2 fn1 says: 2 fn1 says: 3 fn1 says: 3 fn1 says: 3 fn1 says: 3 fn1 says: 4 fn1 says: 4 fn1 says: 4 fn1 says: 4
組合
var callbacks = $.Callbacks("once,memory"); callbacks.add( fn1 ); callbacks.fire( "1" ); callbacks.add( fn1 ); callbacks.fire( "2" ); callbacks.add( fn1 ); callbacks.fire( "3" ); callbacks.add( fn1 ); callbacks.fire( "4" );