Это может быть немного трудно получить помощь, но здесь идет речь: поэтому у меня по сути есть очень вложенный набор обещаний, которые должны выполняться синхронно.Я использую API-интерфейс spotify для создания списков воспроизведения на основе введенных пользователем параметров, в этой демонстрации используется только настроенное пользователем настроение.
Сначала я нахожу 50 лучших исполнителей пользователя, затем для каждого исполнителя я нахожу все альбомы.Из каждого альбома я нахожу треки.Для каждого трека я нахожу аудиофункции, затем проверяю, соответствуют ли они параметру (valence> .5), и добавляю его в окончательный массив, если он подходит.Проблема, с которой я сталкиваюсь, заключается в том, что он пытается добавить треки в список воспроизведения, прежде чем треки возвращаются из цепочки обещаний.Я пытался использовать Promise.all, но я не уверен, как именно его использовать.Вся концепция асинхронных вызовов и обещаний немного сбивает с толку, приходя из 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;
}