Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQueryAjax循环调用只运行一次-是否存在计时和退出条件问题? 出身背景_Javascript_Ajax_Jquery_Dom - Fatal编程技术网

Javascript jQueryAjax循环调用只运行一次-是否存在计时和退出条件问题? 出身背景

Javascript jQueryAjax循环调用只运行一次-是否存在计时和退出条件问题? 出身背景,javascript,ajax,jquery,dom,Javascript,Ajax,Jquery,Dom,我正在构建一个针对EchoNest API使用autocomplete的表单 首先,用户选择一位艺术家,使用艺术家建议调用。接下来,他们选择一首歌曲,但歌曲和/或艺术家歌曲搜索不提供通配符搜索。它只返回完全匹配的结果。所以,基于论坛,他们建议建立一个歌曲阵列,并在阵列上使用自动完成。我一次最多只能得到100个回复。根据最初的反应,我确实知道歌曲的数量 我的计划: 将ajax调用包装在for循环“runonceloop”中。 用歌曲总数修改第一次响应后的循环退出条件。 我面临的挑战是: “runo

我正在构建一个针对EchoNest API使用autocomplete的表单

首先,用户选择一位艺术家,使用艺术家建议调用。接下来,他们选择一首歌曲,但歌曲和/或艺术家歌曲搜索不提供通配符搜索。它只返回完全匹配的结果。所以,基于论坛,他们建议建立一个歌曲阵列,并在阵列上使用自动完成。我一次最多只能得到100个回复。根据最初的反应,我确实知道歌曲的数量

我的计划: 将ajax调用包装在for循环“runonceloop”中。 用歌曲总数修改第一次响应后的循环退出条件。 我面临的挑战是: “runonceloop”只完成一个循环,因为或至少我相信:

在接收到第一个响应[1]之前满足退出条件。 我试图调整“退出条件”和“计数器”,以便在成功块结束时设置和增加它们。这似乎锁定了我的浏览器

有人能为这种情况提供一些指导吗?[2]

我真的很感激

我也不认为关闭异步是个好主意,因为它会锁定浏览器

答复[1]: 代码[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;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();

{检查控制台}

感谢您的修复。它现在运行得更好了:-但是它实际运行了3次,但没有遵循附加的numsongs退出条件。对于所示的示例响应,第一次响应之后的j numsongs应该是121。取而代之的是“2”。总共有121个结果。我尝试使用“numsongs=data.response.total”对其进行调整,我知道从第一个json正确读取了总计。我在代码中添加了注释,试图澄清。参见“成功”后面的第3行
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.
                    }
                  });
}};
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();