2013-11-04 39 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