Javascript - XMLHttpRequest подробный анализ примера
Материал из support.qbpro.ru
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); };