如何在javascript中使用for循环检索多个JSON对象

时间:2013-05-05 02:05:46

标签: javascript json last.fm

我一直在使用Last.fm API和JSON,我一直试图在过去12个月内按月检索用户的顶级艺术家。我尝试设置一个for循环来遍历每个月,然后提取对应于那个月的相关JSON数据,但从我可以看出,似乎for循环运行得比JSON调用快得多。

我正在使用Felix Bruns的last.fm javascript API https://github.com/fxb/javascript-last.fm-api

我检查了控制台,除了12以外没有记录月份的值。我还得到一个未捕获的参考错误“json ## ....未定义”

我尝试寻找解决方案,但我的所有搜索结果都是如何循环API调用的结果,而我正在寻找如何编写一个检索多个JSON对象的循环。

<script type="text/javascript">

  var apiKey = "b0da1774db3d010f62b11f67c4de0667";
  var secret = "0baa4b10c807acc847128599680679a7";

  var lastfm = new LastFM({
    apiKey : apiKey,
    secret : secret,
    cache : undefined
  });

  var lastfm_2 = new LastFM({
    apiKey : apiKey,
    secret : secret,
    cache : undefined
  });

  $(document).ready(function() {
    $("#submit").click(function() {
      var username = $("#username").val();
      var text = "";
      if (username) {
        $("#title").html("Your Most Played Artist by Month");
        $("#title").css("color", "#222");
        // Get top artists for each month
        var topArtistsByMonth = new Array();
        for (var month = 0; month < 12; month++) {
          lastfm.user.getTopArtists({user: username, period: "1month", limit: 15, page: month + 1}, {success: function(data) {
            topArtistsByMonth.push(data.topartists);
            console.log("Month " + month + ": " + data.topartists);
          }});
        }
      } else {
        alert("No username");
      }
    });
  });

</script>

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

getTopArtists是异步的,因此仅调用启动请求;它不等待它完成。回调就是你知道什么时候完成的。这意味着你的for循环将它们全部并行启动,然后在完成后收集结果。但是,由于它们可以按任何顺序完成,因此无法保证topArtistsByMonth处于任何顺序。要解决这个问题,您可能希望使用显式索引而不是使用push

for(var month = 0; month < 12; month++) {
    // We need to use an anonymous function to capture the current value of month
    // so we don't end up capturing the reference to month that the for loop is
    // using (which, by the time the callbacks complete, will always be 12.)
    (function(month) {
        lastfm.user.getTopArtists({user: username, period: "1month", limit: 15, page: month + 1}, {success: function(data) {
            topArtistsByMonth[month] = data.topartists;
            console.log("Month " + month + ": " + data.topartists);
        }});
    })(month);
}

如果您想知道何时下载了所有数据,您将需要另一个变量来跟踪到目前为止已完成的数量。每次调用回调时,你都需要增加它并查看它是否已经命中12。如果有,则已下载所有数据。