这可能很难获得帮助,但是可以解决:我本质上有一组非常嵌套的Promise,需要同步运行。我正在使用Spotify API根据用户输入的参数生成播放列表,此演示仅使用用户输入的心情。
首先,我找到用户的前50位歌手,然后为每位歌手找到所有专辑。从每张专辑中,我都能找到曲目。对于每个轨道,我都会找到音频特征,然后检查它们是否适合参数(价> .5),并在适合的情况下将其添加到最终数组中。我遇到的问题是,它会在从诺言链返回曲目之前尝试将曲目添加到播放列表中。我尝试使用Promise.all,但不确定如何使用。异步调用和promise的整个概念有点让人困惑,因为它来自Java,所以我有点迷茫。 spotifyWebApi的功能来自此包装器https://github.com/JMPerez/spotify-web-api-js。
这是我的代码:
function getSongs(){
getTopArtists();
var artists = JSON.parse(localStorage.getItem('userTopArtists'));
var songsToAdd = [];
var i = 0;
//timed loop to handle API rate limit (work in progress)
function timedLoop() {
setTimeout(function() {
//get albums of artist
spotifyApi.getArtistAlbums(artists[i])
.then(function(data) {
var albs = data.items;
//for each album
for(var i = 0; i < albs.length; i++) {
//retrieve tracklist from album
spotifyApi.getAlbumTracks(albs[i].id)
.then(function(songs){
//get each track
songs.items.map(function(b){
//get features for track
spotifyApi.getAudioFeaturesForTrack(b.id)
.then(function(features){
//check user inputted mood
if(localStorage.getItem('mood') === 'Happy'){
//check if song is happy
if(features.valence > .5){
songsToAdd.push(b.uri);
}
} else if(localStorage.getItem('mood') === 'Sad'){
//check if song is sad
if(features.valence <= .5){
songsToAdd.push(b.uri);
}
}
})
})
})
}
})
i++;
if(i < 1){
timedLoop();
}
}, 10000)
}
timedLoop();
console.log(songsToAdd);
return songsToAdd;
}