Javascript - XMLHttpRequest подробный анализ примера

Материал из Tech_support
Перейти к навигации Перейти к поиску
function parallel() {
 var first = arguments[0];                                  //берем из списка аргументов первый (нулевой)
 if( first ) {                                              // если первый (нулевой) аргумент  есть
    var results, methods = [], callback = function(){};     //объявляем переменные
    if(first.constructor === Function) {                    //если первый (нулевой) аргумент функция 						                            
                                                            //(коструктор объекта - функция)
        results = [];                                       //пустой массив результатов
        if(arguments !== undefined)                         //если  аргументы не  undefined  т.е. существуют
        for( var i=0, l=arguments.length; i<l; ++i ) {      //все аргументы по порядку
            var value = arguments[i];                       //значение i-того аргумента в кэш
            if(i !== l-1) {                                 //не могу понять смысл это выражения (если i не равно 0 в противном случае -1 , т.е false)
                methods.push( value );                      //добавляем значение начение i-того аргумента в конец массива  methods
            }
            else {                                          //иначе
                callback = value;                           //callback присваиваем значение кэша
            }
        }   
        methods.iterate(function(func, i) {                 //объеку methods добавляем метод iterete
            nextTick(function() {
                func.call({
                    end : function( res ) {
                        methods[i].__done__ = true;
                        results[i] = res;
                    }
                })
            })
        });
    }
    else {
        var keys = [];
        results  = {};
        callback = arguments[1] !== undefined ? arguments[1] : function(){}; 
        var methodsData = first;
        for( var i in first ) {
            keys.push( i );
            methods.push( first[i] );
        }
        methods.iterate(function(func, i) {
            nextTick(function() {
                func.call({
                    end : function( res ) {
                        methods[i].__done__ = true;
                        results[keys[i]] = res;
                    }
                })
            })
        });
    }
}
function isDone() {
    var done = true;
    for(var i=0, l=methods.length; i<l; ++i) {
        if(!methods[i].__done__) {
            done = false;
            break;
        }
    }
    return done;
}
function finish() {
    nextTick(function() {
        var done = isDone();
        if(!done) {
            finish();
        }
        else {
            if( results.constructor === Array ) {
                callback.apply( Global, results );
            }
            else {
                callback( results );
            }
        }
    });
}
nextTick(finish);
};