Не получается получить вложенные обещания для работы - Spotify API, Javascript - PullRequest
0 голосов
/ 19 ноября 2018

Это может быть немного трудно получить помощь, но здесь идет речь: поэтому у меня по сути есть очень вложенный набор обещаний, которые должны выполняться синхронно.Я использую 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;
}
...