getJSON运行顺序

时间:2014-11-13 22:45:31

标签: jquery getjson

我完全清楚getJSON是异步运行的,但是我无法理解为什么我的程序总是返回相同的数据。我循环查看可能的站点列表以查询并使用getJSON返回数据,然后操纵数据,但是在我的循环的每次迭代中,我回来的数据似乎都是相同的。直接运行此代码时,我得到预期值(不在循环中)。我收到第二组或第三组数据的情况很奇怪,但我认为这是由网络比平时更快造成的。

var songObj;

for(i = 0; i < networks.length; i++)
{
    runJSON(networks[i],"track",false);

    songObj = [];

    $.when.apply($, deferreds).then(function() {
        songObj = ($.grep(songList, function(e){return e.artist == curSong[0].artist}));
        console.log(songList);
        imgCode  =  "<a href='" + songObj[0].link 
                 + "'><img id = 'spotifyLogo' src='images/spotify.jpg' alt='mIage'></a>";
        theValue = imgCode + "<br>"
                 + "Available on Spotify for " + songObj[0].price
                 + "<br> <br>";

        $("#songDisplay").append(theValue);
        deferreds = [], index;
    });
}

function runJSON(network,searchType,display){
    var URL  = returnURL(network,searchType,$('#song_field').val().split(' ').join("+"));

    var val  = $('#song_field').val();
    var data = {val: val}

    deferreds.push($.getJSON(URL, data, function(data){

        if(document.getElementById("box") !== "undefined" && display == true){
            clearScreen();
            createCols();
        }

        songList = [];
        eval(network + "(data);");

        if(display === true){
            for(i = 0; i < songList.length; i++)
            {   
                displayTrack(i);
            }
        }

        done = true; 

    }));
}

1 个答案:

答案 0 :(得分:0)

您的代码说明了这一点:

  1. 启动一系列异步操作
  2. 等待所有人完成($.when.apply(...)
  3. 处理songList数组
  4. http://api.jquery.com/jQuery.when/

      

    在将多个Deferred对象传递给jQuery.when()的情况下,该方法从一个新的&#34; master&#34;中返回Promise。延迟对象,用于跟踪已传递的所有Deferred的聚合状态。只要所有Deferreds解析

    ,该方法就会解决其主延期

    每个异步操作都是

    1. 清除songList数组
    2. 将一些数据添加到songList数组
    3. 因此,您的流程将会继续(例如;顺序可能会有所不同)

      • 清除songList,将列表1添加到songList
      • 清除songList,将列表2添加到songList
      • ...
      • 清除songList,将列表 n 添加到songList
      • 处理songList

      即。无论最后执行哪个异步操作都会清除之前的任何内容并添加其列表。

      如果你真的想坚持使用全局songList变量,而不是在每次runJSON调用中清除它,你可以在循环之前清除它,然后将所有结果附加到一个长列表中。或者为了使它们分开,将它作为一个数组数组(例如)。