標籤:idt cal .sh alt sts jquer arguments list deferred
例子的詳細講解
Filter Resolve
上面的的代碼是怎麼啟動並執行呢
點擊button的先執行 $.Deferred(),得到具有很多方法的defer
defer.resolve( 5 );
var doneList = jQuery.Callbacks( "once memory" ),failList = jQuery.Callbacks( "once memory" ),progressList = jQuery.Callbacks( "memory" ),state = "pending";lists = {resolve: doneList,reject: failList,notify: progressList}for ( key in lists ) {deferred[ key ] = lists[ key ].fire;deferred[ key + "With" ] = lists[ key ].fireWith;}//根據上面的代碼可得//deferred[ ‘resolve‘]=lists[ ‘resolve‘].fire;//deferred[ ‘resolveWidth‘]=lists[ ‘resolve‘].fireWith;//deferred[ ‘reject‘]=lists[ ‘reject‘].fire;//deferred[ ‘rejectWidth‘]=lists[ ‘reject‘].fireWith;//deferred[ ‘notify‘]=lists[ ‘notify‘].fire;//deferred[ ‘notifyWidth‘]=lists[ ‘notify‘].fireWith;//因此resolve( 5 )執行了
fire: function() { self.fireWith( this, arguments ); return this;},fireWith: function( context, args ) {//stack=[];為true;firing 為false;flag={} if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); }//memory =undefined } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this;}
fire = function( context, args ) { args = args || [];//memory = [ context, args ];即為self,和5 memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) {//函數執行後為false並且flags.stopOnFalse 為true時memory = true;//注意這裡執行了函數 if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else {//最終又把list函數組給賦值為空白 list = []; } } }
jquery1.7.2的源碼分析(三)$.Deferred