2013-01-23 29 views
1

我有以下功能运行良好,除了一件事情。它首先附加的内容没有任何影响。jQuery每个超时

(function biograf(){ 
    var placeholder = $('#top-imageholder'); 
    $('ul#biomenu > li').each(function(){ 
    var obj = $(this); 
    var pageLink = obj.find('a:first').attr('href'); 
    $.get(pageLink, function(data) { 
     placeholder.append($(data).find('#top-imageholder').html()); 
     placeholder.append($(data).find('#top-imageholder').siblings('ul')); 
    }); 
    }); 
})(); 

我想追加占位符的函数我的列表项目被放置在#biomenu中的顺序。

它在90%的时间内完成这项工作,但偶尔会以不同的顺序追加。

有什么建议吗?

+1

你使用'任何地方setTimeout'? –

+1

您可能想重新提出这个问题。没有超时,而是一个异步的'.get()'。这种秩序正在被不同步性所击败。 –

+0

您应该考虑将您的所有页面链接捆绑到一个请求中,并让服务器组成整个响应。这将解决该问题并避免用近乎同步的请求轰炸服务器。 –

回答

1

好了它与下面的代码工作:

(function biograf(){ 
    var placeholder = $('#top-imageholder'); 
    var item = $('ul#biomenu > li'); 
    var index = 0; 

    (function loop(){ 
    setTimeout(function(){ 
     var pageLink = item.eq(index).find('a:first').attr('href'); 
     if(pageLink != undefined){ 
     $.get(pageLink, function(data) { 
      placeholder.append($(data).find('#top-imageholder').html()); 
      placeholder.append($(data).find('#top-imageholder').siblings('ul')); 
     });  
     index++; 
     loop(); 
     } 
    }); 
    })(); 
})(); 

我不知道这是否是最优化的方式,或者如果代码可以tweeked。但它的作品! :)

感谢所有的答复,但!

+0

+1因为它是为你工作的解决方案。当然,如果任何一次通话需要一些时间才能恢复,这可能会再次陷入困境。最糟糕的情况是,您可以随时将$ .get改为$ .ajax,同时选择async选项= false(当然,最后一种方法是async = false会阻止每次调用的UI) – Nope

+0

不会是$ .ajax选项async = false是与$ .get相同,或者你的意思是不同的? – afcdesign

+0

'$ .get'执行异步。 $'.ajax({url:url,data:data,success:success,dataType:dataType});''使用'.ajax'可以让你指定'async: false“选项,它将执行请求”同步“而不是”异步“,这意味着它将在继续执行之前等待请求返回。虽然这可以解决类似于你的问题,但它不是**处理它的首选方式,因为“同步”执行将锁定用户界面直到请求完成,如果请求在服务器上挂起,可能会冻结用户界面。 – Nope

0

$.when(未测试的代码)令结果:

(function(){ 

    var placeholder = $('#top-imageholder'); 
    var promises = []; 

    $('ul#biomenu > li').each(function(){ 
    var obj = $(this); 
    var pageLink = obj.find('a:first').attr('href'); 
    promises.push($.get(pageLink)); 
    }); 

    $.when.apply(null, promises).done(function() { 
    $.each(arguments, function(data) { 
     placeholder.append($(data).find('#top-imageholder').html()); 
     placeholder.append($(data).find('#top-imageholder').siblings('ul')); 
     return true; 
    }); 
    }); 

})();