似乎无法实现嵌套的承诺-Spotify API,Javascript

时间:2018-11-19 06:27:27

标签: javascript api asynchronous promise spotify

这可能很难获得帮助,但是可以解决:我本质上有一组非常嵌套的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;
}

0 个答案:

没有答案