Опубликовано

ERR_INSUFFICIENT_RESOURCES ajax

если бразуер жалуется вот такс: 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());
            }

 

Добавить комментарий

Ваш e-mail не будет опубликован.