если бразуер жалуется вот такс: ERR_INSUFFICIENT_RESOURCES при использовании ajax, то Вам нужно использовать ограниченное кол-во потоков аякса
Нашел хорошее решение потока для ajax на стековерфло. Потом немного допилил под свои нужны. Выглядит он так.
var ajaxManager = (function () { var requests = []; return { addReq: function (opt) { requests.push(opt); }, removeReq: function (opt) { if ($.inArray(opt, requests) > -1) requests.splice($.inArray(opt, requests), 1); }, run: function () { var self = this, oriSuc; if (requests.length) { current_request= requests.shift(); oriSuc = current_request.complete; current_request.complete = function () { if (typeof (oriSuc) === 'function') oriSuc(); self.run.apply(self, []); }; $.ajax(current_request); } else { self.tid = setTimeout(function () { self.run.apply(self, []); }, 1000); } }, stop: function () { requests = []; clearTimeout(this.tid); } }; }());
Чтобы запустить многопоточно делаем
for(var i=0;i<THREAD;i++) ajaxManager.run();
Пример добавления в поток
ajaxManager.addReq({ type: "POST", url: "ajax.php", data: {action: actions.getNumPages, params: city}, success: function (data) { //to do } });
Пример реального кода со страницы парсера
var cities = ['abakan', 'anapa', 'angarsk', 'arhangelsk', 'astrahan', 'barnaul', 'belgorod', 'blagoveshchensk', 'bratsk', 'briansk', 'vnovgorod', 'vladivostok', 'vladikavkaz', 'vladimir', 'vgrad', 'volzhskiy', 'vologda', 'vorkuta', 'voroneg', 'gorno-altaysk', 'grozniy', 'dzerzhinsk', 'ekaterinburg', 'ivanovo', 'igevsk', 'irkutsk', 'yoshkar-ola', 'kazan', 'kaliningrad', 'kaluga', 'kemerovo', 'kirov', 'komsomolsk-na-amure', 'kopeysk', 'kostroma', 'krasnodar', 'krsk', 'kyrgan', 'kursk', 'kyzyl', 'lipeck', 'magnitigorsk', 'maikop', 'mahachkala', 'msk', 'murmansk', 'naberezhnie-chelnu', 'nalchik', 'nizhnevartovsk', 'nnov', 'nizhniy-tagil', 'novokuzneck', 'novorossiysk', 'nsk', 'omsk', 'orel', 'orenburg', 'penza', 'perm', 'petrozavodsk', 'pskov', 'rostov', 'ryazan', 'samara', 'spb', 'saransk', 'saratov', 'smolensk', 'sochi', 'stpol', 'sterlitamak', 'surgut', 'siktivkar', 'taganrog', 'tambov', 'tver', 'toliatti', 'tomsk', 'tula', 'tymen', 'ulan-ude', 'ulyanovsk', 'ufa', 'habarovsk', 'hanti-mansyisk', 'cheboksary', 'cheliabinsk', 'cherepovets', 'cherkessk', 'chita', 'elista', 'yakutsk', 'yaroslavl']; var actions = {}; actions.processor = 'ajax.php'; actions.method = 'POST'; actions.getNumPages = 'getNumPages'; actions.getLinksFromList = 'getLinksFromList'; actions.getDataFromSinglePage = 'getDataFromSinglePage'; actions.AddDealerToDb = 'AddDealerToDb'; var THREAD=30; $(document).ready(function () { $("#start").click(function () { cities.forEach(function (item, i, arr) { getNumPages(item); }); for(var i=0;i<THREAD;i++) ajaxManager.run(); }); }); var ajaxManager = (function () { var requests = []; return { addReq: function (opt) { requests.push(opt); }, removeReq: function (opt) { if ($.inArray(opt, requests) > -1) requests.splice($.inArray(opt, requests), 1); }, run: function () { var self = this, oriSuc; if (requests.length) { current_request= requests.shift(); oriSuc = current_request.complete; current_request.complete = function () { if (typeof (oriSuc) === 'function') oriSuc(); self.run.apply(self, []); }; $.ajax(current_request); } else { self.tid = setTimeout(function () { self.run.apply(self, []); }, 1000); } }, stop: function () { requests = []; clearTimeout(this.tid); } }; }()); function getNumPages(city) { ajaxManager.addReq({ type: actions.method, url: actions.processor, data: {action: actions.getNumPages, params: city}, success: function (data) { var arr = $.parseJSON(data); for (var page = 1; page <= arr.pages; page++) getPage(arr.url, page); } }); } function getPage(url, page) { var full_url = url + page; ajaxManager.addReq({ type: actions.method, url: actions.processor, data: {action: actions.getLinksFromList, params: full_url}, success: function (data) { consoleEcho('Получили ссылки со страницы ' + full_url); var arr = $.parseJSON(data); for (i = 0; i < arr.length; i++) getData(arr[i]); } }); } function getData(link) { ajaxManager.addReq({ type: actions.method, url: actions.processor, data: {action: actions.getDataFromSinglePage, params: link}, success: function (data) { var arr = $.parseJSON(data); addToDb(arr); } }); } function addToDb(data) { ajaxManager.addReq({ type: actions.method, url: actions.processor, data: {action: actions.AddDealerToDb, params: data}, success: function (data) { consoleEcho(data); } }); } function consoleEcho(msg) { var now = new Date(); $("#console").html(now + ': ' + msg + '\n' + $("#console").html()); }