使用jQuery prepend()和JSON的错误顺序

时间:2015-05-23 14:59:59

标签: jquery arrays json prepend

我有这段代码来显示一些Vimeo视频链接

var videos = [72811417, 73540737, 81953800, 75087595, 98673436, 104431470, 106263756, 106286854, 108073907, 110731224, 120420600, 120914125, 127641455, 128529706];

    $.each(videos, function(index, videoid) {
        $.getJSON('http://www.vimeo.com/api/v2/video/' + videoid + '.json?callback=?', {format: "json"}, function(data) {
            $("#blocos-portefolio").prepend('<div class="portefolio-bloco video"><a class="fancybox-vimeo" href="http://player.vimeo.com/video/' + data[0].id +'?color=F05859&autoplay=1"><img class="thumb'+ (index+1) +'" src="' + data[0].thumbnail_large +'"><img class="video_overlay" src="imagens/video_overlay.png"><h3>' + data[0].title.replace("&"," + ").replace(/trailer|_trailer/gi, "").toUpperCase() + '</h3></a></div>');
        });

    });

但由于某种原因,显示顺序并不总是相同。它应该以与数组相反的顺序显示项目,但有时它只是将它混合起来,如14 | 12 | 13而不是14 | 13 | 12。 知道为什么会这样吗? 可以在此处查看实时代码:javadocs

2 个答案:

答案 0 :(得分:0)

可能因为执行AJAX请求是异步操作。所以它很容易发生:

For loop with video id 1
get json for video 1
for loop with video id 2
get json for video 2
result json for video 2
result json for video 1

答案 1 :(得分:0)

  

但由于某种原因,显示顺序并不总是相同。

这是因为ajax调用是异步,并且它们不一定按照启动它们的顺序完成。

如果按顺序排列它们至关重要,那么有十几种不同的方法可以做到这一点。例如,您可以在发出请求时为它们添加隐藏的div,然后在完成时更新div:

var videos = [72811417, 73540737, 81953800, 75087595, 98673436, 104431470, 106263756, 106286854, 108073907, 110731224, 120420600, 120914125, 127641455, 128529706];

$.each(videos, function(index, videoid) {
    $('<div class="portefolio-bloco video" data-index=' + index + '></div>').hide().prependTo("#blocos-portefolio");
    $.getJSON('http://www.vimeo.com/api/v2/video/' + videoid + '.json?callback=?', {format: "json"}, function(data) {
        $("#blocos-portefolio div[data-index=" + index + "]").append('<a class="fancybox-vimeo" href="http://player.vimeo.com/video/' + data[0].id +'?color=F05859&autoplay=1"><img class="thumb'+ (index+1) +'" src="' + data[0].thumbnail_large +'"><img class="video_overlay" src="imagens/video_overlay.png"><h3>' + data[0].title.replace("&"," + ").replace(/trailer|_trailer/gi, "").toUpperCase() + '</h3></a>').show();
    });
});