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 回答