2013-11-04 22 views
0

我正在尝试创建一个帮助文件,该文件将返回任何艺术家相关艺术家的最佳曲目。我只想用1个艺术家的URI来表达他们的相关艺术家的名字,流行度和顶级曲目。我希望将顶部曲目功能划分为一个单独的文件,我可以随时调用。返回热门曲目Spotify API

但是,我似乎无法弄清楚如何正确地返回相关艺术家的最佳曲目。

在我的 “GET-toptrack.js” 文件:

require([ 
     '$api/models', 
     '$api/toplists#Toplist' 
    ], function(models, Toplist) { 
     'use strict'; 

     var doGetTopTrack = function(uri, num) { 
     var artistURI = uri; 
     var artist = models.Artist.fromURI(artistURI); 
     var artistTopList = Toplist.forArtist(artist); 

     artistTopList.tracks.snapshot().done(function(snapshot){ 

      snapshot.loadAll('name').done(function(tracks) { 
      var i, num_toptracks; 
      num_toptracks = num; 

       for(i = 0; i < num_toptracks; i++){ 
       console.log("top track: " + tracks[i].name); 
       // WHERE DO I RETURN THE TOP TRACKS?? 
       } 
      }); 
     }); 
     }; 

     exports.doGetTopTrack = doGetTopTrack; 
    }); 

在我的 “artist.js” 文件“:

require([ 
    '$api/models', 
    'scripts/get-toptrack' 
    ], function(models, getTopTrack) { 
    'use strict'; 

    var showRelated = function() { 
     var artist_properties = ['name', 'popularity','related', 'uri']; 

     models.Artist 
     .fromURI('spotify:artist:11FY888Qctoy6YueCpFkXT') 
     .load(artist_properties) 
     .done(function(artist){ 

      artist.related.snapshot().done(function(snapshot){ 
      snapshot.loadAll('name').done(function(artists) { 

       for(var i = 0; i < artists.length; i++){ 
       var u, p, n, t, listItem; 

       // store artist details 
       p = artists[i].popularity; 
       n = artists[i].name; 
       u = artists[i].uri; 

       // am I missing something here? 
       t = getTopTrack.doGetTopTrack(u, 1); 

       listItem = document.createElement("li"); 
       listItem.innerHTML = "<strong>Name</strong>: " + n.decodeForText() + " | <strong>Popularity: </strong> " + p + " | <strong>Top Track: </strong>" + t; 

       // undefined name 
       $('#artistsContainer').append(listItem); 

       } 
      }); 

      }); 
     }); 
    }; 

    exports.showArtists = showArtists; 
    }); 

而在 'main.js' 文件,我调用函数的艺术家开始。

require([ 
    '$api/models', 
    'scripts/artist' 
], function(models, initArtist) { 
    'use strict'; 

    initArtist.showRelated(); 
}); 

回答

1
,因为我还没有重构我的应用程序分割成多个文件

不能在多个.js文件发表评论。

只要返回去,你在异步应用程序中工作,所以你不能。您必须使用回调,否则Spotify Promise可能会使您的api与Spotify更加一致。查看Promise.each()的文档。

这是一个回调方法的实现。改变了一些东西让我更容易测试。取而代之,让生活更容易传递给艺术家。另外,由于第二位艺术家的顶级名单可能会比第一名更快回归,因此无法保证他们将出现的顺序。如果您想保持订单,您需要添加更多代码。

function doGetTopTrack(artist, num, callback) { 
    var artistTopList = Toplist.forArtist(artist); 

    artistTopList.tracks.snapshot(0,num).done(function (snapshot) { //only get the number of tracks we need 

     snapshot.loadAll('name').done(function (tracks) { 
      var i, num_toptracks; 
      num_toptracks = num; //this probably should be minimum of num and tracks.length 

      for (i = 0; i < num_toptracks; i++) { 
       callback(artist, tracks[i]); 
      } 
     }); 
    }); 
}; 

function showRelated() { 
    var artist_properties = ['name', 'popularity', 'related', 'uri']; 

    models.Artist 
     .fromURI('spotify:artist:11FY888Qctoy6YueCpFkXT') 
     .load(artist_properties) 
     .done(function (artist) { 

      artist.related.snapshot().done(function (snapshot) { 
       snapshot.loadAll('name').done(function (artists) { 

        for (var i = 0; i < artists.length; i++) { 
         // am I missing something here? 
         doGetTopTrack(artists[i], 1, function (artist, toptrack) { 
           console.log("top track: " + toptrack.name); 

           var p = artist.popularity; 
           var n = artist.name; 
           var u = artist.uri; 

           //listItem = document.createElement("li"); 
           console.log("<strong>Name</strong>: " + n.decodeForText() + " | <strong>Popularity: </strong> " + p + " | <strong>Top Track: </strong>" + toptrack.name); 

           //// undefined name 
           //$('#artistsContainer').append(listItem); 
         }); 
        } 
       }); 

      }); 
     }); 
}; 
showRelated(); 
+0

谢谢你。解释很多! – cusejuice

+0

是否有一个特别的理由来保留抓住轨道的“秩序”?如果是这样,你能指出我在Spotify Docs中寻找什么的正确方向吗? – cusejuice

+0

在这种情况下,我认为没有理由维持秩序。但是,如果您确实想确保您的艺术家列表条目与'相关'的顺序相同,那么您需要重做逻辑以存储每条曲目并在最后输出它们。 – Thomas