zoukankan      html  css  js  c++  java
  • jquery1.7.2的源码分析(四)$.Deferred(2)

    jQuery.Callbacks = function( flags ) {
    // Convert flags from String-formatted to Object-formatted
    // (we check in cache first)
    flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
    var // Actual callback list
    list = [],
    // Stack of fire calls for repeatable lists
    stack = [],
    // Last fire value (for non-forgettable lists)
    memory,
    // Flag to know if list was already fired
    fired,
    // Flag to know if list is currently firing
    firing,
    // First callback to fire (used internally by add and fireWith)
    firingStart,
    // End of the loop when firing
    firingLength,
    // Index of currently firing callback (modified by remove if needed)
    firingIndex,
    // Add one or several callbacks to the list
    add = function( args ) {
    var i,
    length,
    elem,
    type,
    actual;
    for ( i = 0, length = args.length; i < length; i++ ) {
    elem = args[ i ];
    type = jQuery.type( elem );
    if ( type === "array" ) {
    // Inspect recursively
    add( elem );
    } else if ( type === "function" ) {
    // Add if not in unique mode and callback is not in
    if ( !flags.unique || !self.has( elem ) ) {
    list.push( elem );
    }
    }
    }
    },
    // Fire callbacks
    fire = function( context, args ) {
    args = args || [];
    memory = !flags.memory || [ context, args ];
    fired = true;
    firing = true;
    firingIndex = firingStart || 0;
    firingStart = 0;
    firingLength = list.length;
    for ( ; list && firingIndex < firingLength; firingIndex++ ) {
    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 = [];
    }
    }
    },
    // Actual Callbacks object
    self = {
    // Add a callback or a collection of callbacks to the list
    add: function() {
    if ( list ) {
    var length = list.length;
    add( arguments );
    // Do we need to add the callbacks to the
    // current firing batch?
    if ( firing ) {
    firingLength = list.length;
    // With memory, if we're not firing then
    // we should call right away, unless previous
    // firing was halted (stopOnFalse)
    } else if ( memory && memory !== true ) {
    firingStart = length;
    fire( memory[ 0 ], memory[ 1 ] );
    }
    }
    return this;
    },
    // Remove a callback from the list
    remove: function() {
    if ( list ) {
    var args = arguments,
    argIndex = 0,
    argLength = args.length;
    for ( ; argIndex < argLength ; argIndex++ ) {
    for ( var i = 0; i < list.length; i++ ) {
    if ( args[ argIndex ] === list[ i ] ) {
    // Handle firingIndex and firingLength
    if ( firing ) {
    if ( i <= firingLength ) {
    firingLength--;
    if ( i <= firingIndex ) {
    firingIndex--;
    }
    }
    }
    // Remove the element
    list.splice( i--, 1 );
    // If we have some unicity property then
    // we only need to do this once
    if ( flags.unique ) {
    break;
    }
    }
    }
    }
    }
    return this;
    },
    // Control if a given callback is in the list
    has: function( fn ) {
    //判断是否已经存在这个函数
    if ( list ) {
    var i = 0,
    length = list.length;
    for ( ; i < length; i++ ) {
    if ( fn === list[ i ] ) {
    return true;
    }
    }
    }
    return false;
    },
    // Remove all callbacks from the list
    empty: function() {
    //清空函数组
    list = [];
    return this;
    },
    // Have the list do nothing anymore
    disable: function() {
    //使得不可能
    list = stack = memory = undefined;
    return this;
    },
    // Is it disabled?
    disabled: function() {
    //判断是不是不可能了
    return !list;
    },
    // Lock the list in its current state
    lock: function() {
    stack = undefined;
    if ( !memory || memory === true ) {
    self.disable();
    }
    return this;
    },
    // Is it locked?
    locked: function() {
    return !stack;
    },
    // Call all callbacks with the given context and arguments
    fireWith: function( context, args ) {
    if ( stack ) {
    if ( firing ) {
    //不是只执行一次
    if ( !flags.once ) {
    stack.push( [ context, args ] );
    }
    } else if ( !( flags.once && memory ) ) {
    fire( context, args );
    }
    }
    return this;
    },
    // Call all the callbacks with the given arguments
    fire: function() {
    self.fireWith( this, arguments );
    return this;
    },
    // To know if the callbacks have already been called at least once
    fired: function() {
    //是否已经执行完了
    return !!fired;
    }
    };
    return self;
    };
    
  • 相关阅读:
    好久不见(致win7)
    mysql update
    两个日期相差的天数
    java 文件指针复位
    shell编程: 获得目录下(包括子目录)所有文件名,路径和文件大小
    爬虫(2)
    爬虫
    eclipse 创建dynamic web project不能运行
    JSP Servlet之间交换数据
    html5视频播放插件
  • 原文地址:https://www.cnblogs.com/heyinwangchuan/p/6259396.html
Copyright © 2011-2022 走看看