Javascript Jquery$。每个通过数组

Javascript Jquery$。每个通过数组,javascript,jquery,arrays,Javascript,Jquery,Arrays,我使用这段代码循环一个数组,并为每个值调用函数doAjax: 函数doAjax将进行Ajax调用,并将一些数据附加到html页面。问题是,当我循环遍历大型数组10+索引时,它会导致我的网站崩溃 我能想到的解决这个问题的唯一方法是使页面的侦听器如下所示: $(window).scroll(function(){ if($(window).scrollTop() + $(window).height() >= $(document).height() - 50){ /

我使用这段代码循环一个数组,并为每个值调用函数doAjax:

函数doAjax将进行Ajax调用,并将一些数据附加到html页面。问题是,当我循环遍历大型数组10+索引时,它会导致我的网站崩溃

我能想到的解决这个问题的唯一方法是使页面的侦听器如下所示:

$(window).scroll(function(){
     if($(window).scrollTop() + $(window).height() >= $(document).height() - 50){
        //code to trigger function goes here
    }
});
因此,当用户滚动到页面底部时,将加载更多内容

所以我想让我的$。每个只调用doAjax 3或4次。我遇到的问题是,它从数组中调用相同的值,因此我创建了一个临时变量并将原始数组存储在其中,如下所示:

var temp = categories; 
然后每次运行$.each时,我都会从临时数组中删除该值

我知道这不是他做事的最佳方式,但这是我能想到的


如果你能提出一个更好的方法来解决这个问题,我们将不胜感激。否则,我希望我的$.each至少运行一次,并仅在加载文档时循环3或4个元素,然后删除它已经执行的数组元素,然后,当用户滚动到页面底部时,仅通过3或4个元素再次运行,直到临时数组中没有更多元素。

要循环并删除类别数组,请尝试

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;  
}

附加array=>doAjax函数的所有结果,然后在完成后,再附加到页面。。阿拉

这可能有助于减少阵列:

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');
}

为什么不能在一个结果中传递所有类别值并以json的形式得到响应呢?我使用的是谷歌搜索api。我想对每个项目进行一次调用。可能需要限制scroll处理程序中运行的代码。请记住,当用户移动scrollbarI时,scroll事件每秒会触发多次。我想我可以通过创建一个var并将其设置为true或false,然后进行检查来解决此问题。这样行吗?类别=sendAjaxcategories;
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');
}