Я полностью понимаю, что getJSON работает асинхронно, однако мне трудно понять, почему моя программа всегда возвращает одни и те же данные. Я просматриваю список возможных сайтов для запроса и использования getJSON для возврата данных, а затем манипулирования данными, однако на каждой итерации моего цикла данные, которые я возвращаю, кажутся одинаковыми. При запуске этого кода я получаю ожидаемое значение (не в цикле). Были случаи, когда я получил второй или третий набор данных, однако я предполагаю, что это вызвано тем, что сеть работает быстрее обычного.getJSON running order
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;
}));
}
Глобальный 'songList', установленный в каждом обработчике успеха' runJSON', касается меня (или если бы что-нибудь было добавлено к нему, я предполагаю, что вы удалили какой-то код, который это делает). Есть все шансы, что все обработчики 'getJSON' будут выполняться до запуска любого из обработчиков' then() '.Все эти обработчики получат одинаковые (последние) значения 'songList'. –
@PaulRoub Вы правы в том, что последние значения songList всегда возвращаются. Код, который добавляет к songList, находится в displayTracks(), который я не копировал, потому что я не был уверен, что это актуально, это существенно толкает данные, которые я хочу из json в объект. Почему это будет проблемой? –