【发布时间】:2015-09-14 15:48:24
【问题描述】:
我需要一些帮助。我对 Javascript 很陌生,我目前正在尝试使用 两个不同的 api 做一些事情:SongKick 和 Deezer。这个想法很简单,在页面上你可以输入你的城市,1)我首先向 Songkick Api 请求获取这个城市的 ID,2) 然后使用 ID,我再次请求获取音乐会列表,我只获取艺术家的姓名(最多 20 个),3) 然后我使用 deezer Api 的姓名列表获取艺术家的照片和 mp3 预览。
我尝试了很多方法,但我当然不能到处访问数据,而且我不知道如何使用回调,因为东西太多了,如果你能看看会很棒。
谢谢!
artistsArray = [];
artistsArray2 = [];
arr = [artistsArray,[],[]];
var dispName;
var areaId;
function search(){
area = document.getElementById('band').value;
function songKickArea(callback){
$.getJSON('http://api.songkick.com/api/3.0/search/locations.json?query=' + area + '&apikey=tIhpFoFn0dWpQ72A',function(data){
var areaId = data['resultsPage']['results']['location'][0].metroArea.id;
callback(areaId);
});
console.log("1 is done");
}
function findAreaId(callback){
songKickArea(function(callback){
console.log(callback);
});
$.getJSON("http://api.songkick.com/api/3.0/metro_areas/" + areaId + "/calendar.json?apikey=tIhpFoFn0dWpQ72A",function(data){
for (var i=0; i<20 ; i++)
{
artistsArray.push(data['resultsPage']['results']['event'][i].performance[0].displayName);
}
callback(artistsArray);
});
console.log("2 is done");
}
function addInfos(callback){
for (var i=0; i<20 ; i++)
{
DZ.api('/search?q=artist:' + '"'+ artistsArray[i]+'"' +'?limit=1', function(json){
if(json.data[0]){
artistsArray2.push({preview:json.data[0].preview, picture: json.data[0].artist.picture})
}
});
}
console.log("3 is done");
callback();
}
function runSearchInOrder(callback) {
songKickArea(function() {
findAreaId(function() {
addInfos(function() {
console.log(areaId);
});
});
});
}
runSearchInOrder(function(){console.log('finished')});
}
编辑 09/17/2015
感谢 Vittore,我查看了 JS 中的 Promise,它对我来说非常有趣和完美。所以现在我在这里:
function songKickArea(areaId){
area = document.getElementById('band').value;
return $.getJSON('http://api.songkick.com/api/3.0/search/locations.json?query=' + area + '&apikey=XXXXXXX',function(data){
});
}
function findAreaId(data){
var areaId = data['resultsPage']['results']['location'][0].metroArea.id;
return $.getJSON("http://api.songkick.com/api/3.0/metro_areas/" + areaId + "/calendar.json?apikey=XXXXXXX",function(data){
});
}
function addInfos(data){
for (var i=0; i<20 ; i++)
{
artistsArray.push(data['resultsPage']['results']['event'][i].performance[0].displayName);
DZ.api('/search?q=artist:' + '"'+ artistsArray[i]+'"' +'?limit=1', function(json){
if(json.data[0]){
artistsArray2.push({preview:json.data[0].preview, picture: json.data[0].artist.picture})
}
});
}
}
我使用这个 onClick:
songKickArea().then(findAreaId).then(addInfos).then(createList);
所以一切正常,在 addInfos 中,我的数组 ArtistArray2 从 deezer 中获取了我需要的所有信息(预览和图片)。但是现在下一步是创建一个列表来显示这些艺术家(或曲目),所以接下来的功能是这样的。
function createList(json){
var html = '<ul>';
for (var i=0; i<17; i++)
{
html+= '<li>';
html += '<div class="picture">' + '<div class="player"><img src="svg/play43.svg" ></div>'+ '<a href=' + artistsArray2[i].preview + '>' + '<img src=' + artistsArray2[i].picture + '>' + '</a>' +'</div>';
html+= '<div class="arrow"><img src="css/svg/arrow487.svg"></div>';
html+= '</li>';
}
html+= '</ul>';
$('#results').append(html);
}
但是在这里我不知道如何将完整数组的值从最后一个函数传递给这个函数,你能帮帮我吗?非常感谢 !
【问题讨论】:
标签: javascript json api callback request