我正在使用 Spotify API 转储用户的所有播放列表以及其中包含的轨道名称。我弄清楚了如何请求该信息,并尝试将其存储在哈希中,其中可以通过播放列表名称找到轨道数组(hash[playlistName] = [track1, track2, etc]
)。当我 console.log 时,一切看起来都很好。
但是当我尝试使用句柄助手来迭代它并显示所有内容时,JavaScript 认为该对象是空的。这是一些代码:
//helper that will display eventually, but right now logs "undefined"
Handlebars.registerHelper('read_hash', function(hash){
console.log(hash.length); //undefined
console.log(Object.keys(hash); //undefined
console.log(hash); //looks fine.. results in screenshot..
});
//ajax request that successfully get's all of the playlist data I want
$.ajax({
url: 'https://api.spotify.com/v1/me/playlists',
headers: {
'Authorization': 'Bearer ' + access_token
},
success: function(response) {
//make a new hash and put in template
var processed = 0;
response.items.forEach(function(e){
var playlistName = e.name;
//get tracks by nesting a request lol
$.ajax({
url: e.tracks.href,
headers: {
'Authorization': 'Bearer ' + access_token
},
success: function(responseTwo) { //returns track objects
playlists[playlistName] = responseTwo.items;
processed++;
}
}).done(function(){
if(processed >= response.items.length)
{
playlistPlaceholder.innerHTML = playlistTemplate({Playlists: playlists}); //get playlists
}
});
});
//handle bars template with call to read_hash
<script id="playlist-template" type="text/x-handlebars-template">
<h1>playlists</h1>
<table>
<tr>
<th>playlist</th>
<th>tracks</th>
</tr>
{{read_hash Playlists}}
</table>
</script>
此外,当我从 read_hash 控制台记录 JSON.stringify(hash) 时,我得到了我想要的结果......也许有些东西正在工作?
最佳答案
我通过利用ajax完成回调修复了它。可能有一种更有组织的方式来解决这个问题,但这是我的解决方案:
转储播放列表数据的ajax请求:
$.ajax({
url: 'https://api.spotify.com/v1/me/playlists',
headers: {
'Authorization': 'Bearer ' + access_token
},
success: function(response) {
//make a new hash and put in template
var processed = 0;
response.items.forEach(function(e){
var playlistName = e.name;
//get tracks by nesting a request lol
$.ajax({
url: e.tracks.href,
headers: {
'Authorization': 'Bearer ' + access_token
},
success: function(responseTwo) { //returns track objects
playlists[playlistName] = responseTwo.items;
processed++;
}
}).done(function(){
if(processed >= response.items.length)
{
playlistPlaceholder.innerHTML = playlistTemplate({Playlists: playlists}); //get playlists
}
});
});
//console.log(playlists);
$('#login').hide();
$('#loggedin').show();
}
});
用于解析关联数组的 Handlebars 助手:
Handlebars.registerHelper('read_hash', function(hash){
jsonHash = JSON.parse(JSON.stringify(hash));
var html = "<table style='width:5px'><tr><th>Playlist</th><th>Track</th></tr>"; //stores markup to write and return at end
for(var playlistName in jsonHash)
{
var playlistTracks = jsonHash[playlistName];
html = html + "<tr><td>" + playlistName + "</td><td><ul>";
for(var i = 0; i < playlistTracks.length; i++)
{
html = html + "<li>" + playlistTracks[i].track.name + "</li>";
}
html = html + "</ul></td></tr>";
}
console.log(html + "</table>");
return new Handlebars.SafeString(html + "</table>");
});
要显示的 Handlebars 模板:
<script id="playlist-template" type="text/x-handlebars-template">
<h1>playlists</h1>
{{read_hash Playlists}}
<table>
<tr>
<th>playlist</th>
<th>tracks</th>
</tr>
</table>
</script>
关于JavaScript 对象为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226381/