Javascript 如何对我的循环函数进行回调
我有一个保存URL的JSON文件。我做了一个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
$.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.
});
});
});