我完全清楚getJSON是异步运行的,但是我无法理解为什么我的程序总是返回相同的数据。我循环查看可能的站点列表以查询并使用getJSON返回数据,然后操纵数据,但是在我的循环的每次迭代中,我回来的数据似乎都是相同的。直接运行此代码时,我得到预期值(不在循环中)。我收到第二组或第三组数据的情况很奇怪,但我认为这是由网络比平时更快造成的。
var songObj;
for(i = 0; i < networks.length; i++)
{
runJSON(networks[i],"track",false);
songObj = [];
$.when.apply($, deferreds).then(function() {
songObj = ($.grep(songList, function(e){return e.artist == curSong[0].artist}));
console.log(songList);
imgCode = "<a href='" + songObj[0].link
+ "'><img id = 'spotifyLogo' src='images/spotify.jpg' alt='mIage'></a>";
theValue = imgCode + "<br>"
+ "Available on Spotify for " + songObj[0].price
+ "<br> <br>";
$("#songDisplay").append(theValue);
deferreds = [], index;
});
}
function runJSON(network,searchType,display){
var URL = returnURL(network,searchType,$('#song_field').val().split(' ').join("+"));
var val = $('#song_field').val();
var data = {val: val}
deferreds.push($.getJSON(URL, data, function(data){
if(document.getElementById("box") !== "undefined" && display == true){
clearScreen();
createCols();
}
songList = [];
eval(network + "(data);");
if(display === true){
for(i = 0; i < songList.length; i++)
{
displayTrack(i);
}
}
done = true;
}));
}
答案 0 :(得分:0)
您的代码说明了这一点:
$.when.apply(...)
)songList
数组http://api.jquery.com/jQuery.when/
在将多个Deferred对象传递给jQuery.when()的情况下,该方法从一个新的&#34; master&#34;中返回Promise。延迟对象,用于跟踪已传递的所有Deferred的聚合状态。只要所有Deferreds解析
,该方法就会解决其主延期
每个异步操作都是
songList
数组songList
数组因此,您的流程将会继续(例如;顺序可能会有所不同)
songList
,将列表1添加到songList
songList
,将列表2添加到songList
songList
,将列表 n 添加到songList
songList
即。无论最后执行哪个异步操作都会清除之前的任何内容并添加其列表。
如果你真的想坚持使用全局songList
变量,而不是在每次runJSON调用中清除它,你可以在循环之前清除它,然后将所有结果附加到一个长列表中。或者为了使它们分开,将它作为一个数组数组(例如)。