2014-01-19 4 views
0

Я использую этот код для перебора массива и вызвать функцию doAjax() для каждого value:

$.each(categories, function(index, value){ 
     doAjax(value); 
}); 

Функцию doAjax() будет сделать вызов Ajax и добавить некоторые данные в HTML стр. Проблема в том, что когда я прохожу через большой массив (индексы 10+), это приводит к сбою моего веб-сайта.

Единственный способ, которым я могу думать, чтобы решить эту проблему, чтобы слушателю страницы, как это:

$(window).scroll(function(){ 
    if($(window).scrollTop() + $(window).height() >= $(document).height() - 50){ 
     //code to trigger function goes here 
    } 
}); 

так, когда пользователь прокрутки в нижней части страницы она будет загружать больше вещей.

Поэтому я хочу, чтобы мой $.each звонил только doAjax() 3 или 4 раза. Проблема я столкнулся в том, что его называя одни и те же значения из массива, так что я сделал временно переменную и сохраненную мой исходный массив в нем, как так:

var temp = categories; 

, а затем каждый раз, когда $.each работает, я удалить значение из массив temp.

Я знаю, что это не лучший способ сделать что-то, но это то, о чем я мог думать.

Если вы можете предложить лучший способ решить эту проблему, которая будет оценена по достоинству. В противном случае я хочу, чтобы мой $ .each запускался хотя бы один раз (и только через 3 или 4 элемента), когда загружается doc, а затем удаляет элементы массива, которые он уже прошел, а затем запускается снова (только через 3 или 4 элемента), когда пользователь прокрутки в нижней части страницы, пока больше нет элементов в массиве темп ..

+0

Почему вы не можете передать все значения категории в одном результате и получить ответ как json? –

+0

Я использую google search api. и я хочу сделать один вызов за элемент. –

+0

, вероятно, нужно задушить код, запущенный в обработчике 'scroll'. Имейте в виду, что событие 'scroll' будет срабатывать много раз в секунду, пока пользователь перемещает полосу прокрутки. – charlietfl

ответ

0

для петли и удалить категории массива попробовать,

function sendAjax(cat) { 
    if(cat.length>1){ 
    var len = (cat.length > 3) ? 3 : cat.length; 
    for (var i = 0; i < len; i++) { //send ajax 3 times 
     if (typeof cat[i] != "undefined") { 
      // doAjax(cat[i]); 
     } 
    } 
    } 
    cat = cat.splice(len);//remove the first three elements from array 
    return cat; 
} 
+0

будет ли это работать? 'categories = sendAjax (категории);' –

+0

да, я так думаю. попробуйте код –

0

как насчет добавления всех результатов вашего массива => doAjax, затем, как только все это будет сделано, затем добавьте на свою страницу. ala

это может работать для уменьшения массива:

var arr2 = categories.splice(0); // copy the original categories array to a new array 
var rotationNum = 3; 
function sendIt(){ 
    var lngth = (arr2.length < rotationNum) ? arr2.length : rotationNum; 
    for (var i = 0; i < lngth ; i++){ 
    //doAjax 
    } 
    arr2.splice(0,lngth); 
} 

или попробуйте ниже, чтобы сохранить все вызовы ajax, а затем добавить.

var categoriesDeferred = []; 

for(var i = 0; i < categories.length; i++){ 
    categoriesDeferred.push(doAjax(categories[i])); 
} 

$.when.apply($, categoriesDeferred).then(everythingDoneFunc); 

function doAjax(data) { 
    var dferred = $.Deferred();  
    //your ajax call here.. . 
    setTimeout(function() { dferred.resolve() }, 2000);  

    return dferred.promise(); 
} 

function everythingDoneFunc(){ 
    console.log('everything processeed'); 
} 
Смежные вопросы