Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.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 如何对我的循环函数进行回调_Javascript_Json_Callback_Jquery Deferred_Each - Fatal编程技术网

Javascript 如何对我的循环函数进行回调

Javascript 如何对我的循环函数进行回调,javascript,json,callback,jquery-deferred,each,Javascript,Json,Callback,Jquery Deferred,Each,我有一个保存URL的JSON文件。我做了一个$.each()循环来遍历JSON文件,然后在循环的每次迭代中执行一个SoundCloud函数。所以,为了得到相同的循环结果,我必须在每次迭代后对我的SoundCloud函数进行回调。以下是我尝试过的: $.getJSON("http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2", function(data){ //Link of the playlist $.each(dat

我有一个保存URL的JSON文件。我做了一个
$.each()
循环来遍历JSON文件,然后在循环的每次迭代中执行一个SoundCloud函数。所以,为了得到相同的循环结果,我必须在每次迭代后对我的SoundCloud函数进行回调。以下是我尝试过的:

$.getJSON("http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2", function(data){ //Link of the playlist

$.each(data.PlayListArray, function(key, val){ //navigate to array called PlayListArray
     var songLink = val.URL; // the value of URL in the array
}, function(){// Callback Function
    SC.get('/resolve', { url: songLink }, function(track) { 
        $("#demo").append("<p id= "+ track.id + ">" + track.title + "</p>");
    });
 });
});
$.getJSON(“http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2,函数(数据){//播放列表的链接
$.each(data.playlayArray,function(key,val){//导航到名为playlayArray的数组
var songLink=val.URL;//数组中URL的值
},function(){//回调函数
SC.get('/resolve',{url:songLink},函数(track){
$(“#demo”).append(

“+track.title+”

”); }); }); });
但是,此回调不起作用,并且不显示从SoundCloud的SC.get()函数收集的数据。 有什么办法让它工作吗?或者我怎样才能有一个延迟方法来生成一个函数链


演示:

这里要做的是将第三个参数传递给每个参数,每个参数只需要两个。除非我遗漏了一些关于您的确切目标的信息,否则下面的代码应该可以正常工作

SC.initialize({
    client_id: "b8f06bbb8e4e9e201f9e6e46001c3acb",
});

$.getJSON("http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2", function(data){ //Link of the playlist
    $.each(data.PlayListArray, function(key, val){ //navigate to array called PlayListArray
        var songLink = val.URL; // the value of URL in the array

        SC.get('/resolve', { url: songLink }, function(track) { 
            $("#demo").append("<p id= "+ track.id + ">" + track.title + "</p>");
        });
    });
});
SC.initialize({
客户id:“B8F06BB8E4E9E201F9E6E46001C3ACB”,
});
$.getJSON(“http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2,函数(数据){//播放列表的链接
$.each(data.playlayArray,function(key,val){//导航到名为playlayArray的数组
var songLink=val.URL;//数组中URL的值
SC.get('/resolve',{url:songLink},函数(track){
$(“#demo”).append(

“+track.title+”

”); }); }); });
编辑:我现在了解到,您希望按照data.PlayArray结果集定义的顺序获取结果。我认为你需要缓冲结果,只有在收到所有答案后才进行处理。下面的代码可能不是最佳的,但它可能会给你一些新的想法

当然,无法控制不同的“SC.get()”响应的顺序,也无法控制调用“function(track)”回调的顺序。在进行下一次调用之前等待每个答案——正如您最初的帖子所建议的那样——确实是另一种可能性,但这将比并行进行所有调用(如下面的代码)慢得多

SC.initialize({
客户id:“B8F06BB8E4E9E201F9E6E46001C3ACB”,
});
$.getJSON(“http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2,函数(数据){//播放列表的链接
var-answer={};
$.each(data.playlayArray,function(key,val){//导航到名为playlayArray的数组
var songLink=val.URL;//数组中URL的值
SC.get('/resolve',{url:songLink},函数(track){
回答[歌曲链接]=曲目;
if(Object.keys(answer.length==data.playlayArray.length){
//我们已经得到了所有结果:让我们通过再次迭代data.playlayarray来处理它们
$.each(data.playlayarray,函数(key,val){
var track=answer[val.URL];
$(“#demo”).append(

“+track.title+”

”); }); } }); }); });
如果要在循环中执行异步调用,经验法则是使用递归函数而不是for循环

function loop(i){
    if(i >= data.PlayListArray.length){
        //DONE
    }else{
        SC.get('blabla', function(track){
          //Loop body
          loop(i+1);
        });
     }
}

loop(0);

正如Arnaulid已经指出的那样,回调的顺序执行将存在很高的延迟,因此首先确保这是您真正想要做的。

正如已经指出的,
$。getJSON
接受参数(url、回调),但是,您也可以链接
。然后(回调)
,这是“promisy”的方法

要确保显示的列表与从中派生的数组的顺序相同,最简单的方法是附加一个空的
p
元素,然后在它到达时用数据填充它。您可以依赖由
$形成的闭包。每个
函数都会保留对附加
p
的可靠引用

$.getJSON("http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2").then(function(data) { //Link of the playlist
    var $demo = $("#demo");
    $.each(data.PlayListArray, function(i, item) { //traverse the PlayListArray array
        var $p = $("<p/>").appendTo($demo);//appending an empty <p></p> here ensures the observable playList will be in the same order as data.PlayListArray. 
        SC.get('/resolve', { url: item.URL }, function (track) {
            $p.attr('id', track.id).text(track.title);//flesh out the <p></p> appended above. $p remains available due to closure formed by the outer function.
        });
    });
});
$.getJSON(“http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2)然后(函数(数据){//播放列表的链接
var$demo=$(“#demo”);
$.each(data.playlayarray,函数(i,项){//遍历playlayarray数组
var$p=$(“

”).appendTo($demo);//在此处添加一个空的

可确保可观察的播放列表的顺序与data.playlayArray相同。 SC.get('/resolve',{url:item.url},函数(track){ $p.attr('id',track.id).text(track.title);//充实了上面附加的

。$p仍然可用,因为外部函数形成了闭包。 }); }); });
还请注意,通过将
$demo
分配给ouside循环,可以避免在每次循环迭代时在DOM中发现
$(“#demo”)
的低效性


感谢您的帖子,但您提供的代码是我的出发点,我注意到循环每次都提供不同的结果。看看这个,并运行它铜币的时间。您将注意到,每次加载的数据的顺序都不同。与JSON文件中数组中的值不同。
$.getJSON("http://www.json-generator.com/api/json/get/bLjOHIYsAy?indent=2").then(function(data) { //Link of the playlist
    var $demo = $("#demo");
    $.each(data.PlayListArray, function(i, item) { //traverse the PlayListArray array
        var $p = $("<p/>").appendTo($demo);//appending an empty <p></p> here ensures the observable playList will be in the same order as data.PlayListArray. 
        SC.get('/resolve', { url: item.URL }, function (track) {
            $p.attr('id', track.id).text(track.title);//flesh out the <p></p> appended above. $p remains available due to closure formed by the outer function.
        });
    });
});