Возврат значений из обратного вызова iTunes Search API
Я прочитал много вопросов об асинхронной функции здесь в Stackru и о том, как возвращать значения, но я не способен применить эти подсказки к моим проектам. Поэтому я прошу вашей помощи для этого.
Я использую API поиска iTunes, чтобы найти песни в магазине, а затем добавить их в "плейлист". Проект разработан в JQuery.
По сути, есть окно поиска под названием "iTunesSearch", в котором я пишу название песни, а затем кнопка "поиск", при нажатии на которую выполняется код для извлечения песни в магазине iTunes. То, что я хочу сделать, это взять название песни, поместить в массив, показать его в div на странице, а затем искать другие песни и повторять процесс снова и снова. В конце я хотел бы иметь массив, который содержит все песни, которые я искал.
Вот код:
$(document).ready(function() {
$('#search').click(function(){
var media = "music";
var limitOfSearchResults = 1;
var thing = document.getElementById('itunesSearch').value;
var whatosearch = $('#itunesSearch').attr('value');
$.getJSON("http://itunes.apple.com/search?term=" + thing
+ "&country=us&limit=" + limitOfSearchResults
+ "&media=" + media
+ "&callback=?",function(data) {
songname = data["results"][0].trackName;
resultPlaylist = createPlaylist(song);
alert(resultPlaylist); //is always 1, it doesn't add songs when I repeat search
});
function createPlaylist(song){
var playlist = new Array ();
playlist.push(song);
return playlist.length; //to test if the array stores the results
)};
});
И вот фрагмент тела HTML:
<input id="itunesSearch" type="text" placeholder="Search for a song..">
<div id="resultiTunes"></div>
<input id="search" type= "button" value="Find!">
Как я могу передать переменную songname за пределы обратного вызова и использовать ее для хранения названия песни в массиве или что-то еще? Я понял, что проблема в том, что обратный вызов выполняется позже. Я попытался вызвать функцию внутри функции обратного вызова, но она не будет складывать песни в массиве (я не включил фрагмент кода для этого из-за сбоя). Есть идеи?
Заранее спасибо.
1 ответ
Решено. Я поместил запрос getJSON в функцию и установил возврат. Затем вызывается состояние.done() для использования результатов:
function foo(){ return $.getJSON("http://itunes.apple.com/search?media=music&term=2&country=it&limit=60&attribute=genreIndex&entity=song&callback=?",function(data) {
//stub
}
)}
foo().done(function(result){
//do something with result})