0

私は Last.fm API と JSON をいじっており、過去 12 か月間、月ごとにユーザーのトップ アーティストを取得しようとしてきました。for ループを設定して毎月実行し、その月に対応する関連する JSON データを取得しようとしましたが、for ループは JSON 呼び出しよりもはるかに高速に実行されているようです。

Felix Bruns の last.fm JavaScript API を使用していますhttps://github.com/fxb/javascript-last.fm-api

コンソールを確認したところ、月の値は 12 を除いてログに記録されませんでした。また、Uncaught Reference Error "json##.... is not defined" も取得しています。

解決策を探してみましたが、検索結果はすべて、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 に答える