0

バックグラウンド

EchoNest API に対してオートコンプリートを使用するフォームを作成しています。

まず、ユーザーは Artist Suggest 呼び出しを使用してアーティストを選択します。次に曲を選択しますが、曲やアーティストの曲の検索で「ワイルドカード」検索が提供されません。完全一致のみを返します。そのため、フォーラムに基づいて、曲の配列を構築し、配列でオートコンプリートを使用することを提案しています。一度に最大 100 件の応答しか取得できません。最初の応答に基づいて、曲の数を知っています。

私の計画:

  • ajax 呼び出しを for ループ ('runonceloop') でラップします。
  • 総曲数での最初の応答の後のループ終了条件を修正します。

私が抱えている課題:

「runonceloop」は、少なくともそれが私が信じているため、単一のループのみを完了します。

  • 最初の応答[1]を受信する前に、終了条件が満たされます。

「終了条件」と「カウンター」が設定され、成功ブロックの最後に増加するように調整しようとしました。これにより、ブラウザがロックされているようです。

誰かがこの状況について何らかのガイダンスを提供できますか? [2]

本当にありがたいです。

また、ブラウザがロックされるため、非同期をオフにすることは良い考えではないと思います。

応答[1] :

    {
  "response": {
    "status": {
      "code": "0",
      "message": "Success",
      "version": "4.2"
    },
      "start": 0,
      "total": 121, //Used for 
      "songs": [
        {
          "id": "SOXZYYG127F3E1B7A2",
          "title": "Karma police"
        },
        {
          "id": "SOXZABD127F3E1B7A2",
          "title" : "Creep"
        }
      ]
    }
  }
}

コード[2]

var songsList = [];
function getSongs() {
            var numsongs = 2; //at least 2 runs.
            var startindex = 0;
            runonceloop: //<~~~~Referenced in question
            for (var j = 0;j >= numsongs;) {

                 console.log('numsongs' + numsongs);
                 $.ajax({

                     url: "http://developer.echonest.com/api/v4/artist/songs",
                     dataType: "jsonp",
                     data: {
                         results: 100,
                         api_key: "XXXXXXXXXXX",
                         format: "jsonp",
                         name: $("#artist").val(),
                         start: startindex

                     },

                    success: function (data) {
                        var songs = data.response.songs;
                        //This is my big problem.  numsongs for the exit condition isn't being modified.
                        numsongs = data.response.total; //modify exit condition
                        for (var i = 0; i < songs.length; i++) {
                            songsList.push(songs[i].title);

                        }

                    j +=100;// increase by 100 to match number of responses.
                    }
                  });
}};
4

1 に答える 1

1

ニーズに合っているかどうかはわかりませんが、構文エラーの一部を修正し、クロージャーを使用してください。

var songsList = [];

function getSongs() {
    var numsongs = 2; //at least 2 runs.
    var startindex = 0;
    runonceloop: //<~~~~Referenced in question
    for (var j = 0; j < numsongs;j++) {
        console.log('numsongs' + numsongs);
        (function(_startindex){
        $.ajax({

            url: "http://developer.echonest.com/api/v4/artist/songs",
            dataType: "jsonp",
            data: {
                results: 100,
                api_key: "XXXXXXXXXXXX",
                format: "jsonp",
                name: $("#artist").val(),
                start: _startindex

            },

            success: function (data) {
                var songs = data.response.songs;
                numsongs = data.response.total; //modify exit condition
                for (var i = 0; i < songs.length; i++) {
                    songsList.push(songs[i].title);
                 console.log(songsList);
                }


            }
        });
        })(startindex);
        startindex+=100;
    }
};

getSongs();

デモ (ダフト パンク) {コンソールを確認してください}

于 2013-06-29T22:03:30.147 に答える