0

在过去的 12 个月里,我一直在使用 Last.fm API 和 JSON,并且一直在尝试按月检索用户的顶级艺术家。我尝试设置一个 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>

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

4

1 回答 1

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。完成后,所有数据都已下载。

于 2013-05-05T02:14:55.727 回答