我一直在使用Last.fm API和JSON,我一直试图在过去12个月内按月检索用户的顶级艺术家。我尝试设置一个for循环来遍历每个月,然后提取对应于那个月的相关JSON数据,但从我可以看出,似乎for循环运行得比JSON调用快得多。
我正在使用Felix Bruns的last.fm javascript API https://github.com/fxb/javascript-last.fm-api
我检查了控制台,除了12以外没有记录月份的值。我还得到一个未捕获的参考错误“json ## ....未定义”
我尝试寻找解决方案,但我的所有搜索结果都是如何循环API调用的结果,而我正在寻找如何编写一个检索多个JSON对象的循环。
<script type="text/javascript">
var apiKey = "b0da1774db3d010f62b11f67c4de0667";
var secret = "0baa4b10c807acc847128599680679a7";
var lastfm = new LastFM({
apiKey : apiKey,
secret : secret,
cache : undefined
});
var lastfm_2 = new LastFM({
apiKey : apiKey,
secret : secret,
cache : undefined
});
$(document).ready(function() {
$("#submit").click(function() {
var username = $("#username").val();
var text = "";
if (username) {
$("#title").html("Your Most Played Artist by Month");
$("#title").css("color", "#222");
// Get top artists for each month
var topArtistsByMonth = new Array();
for (var month = 0; month < 12; month++) {
lastfm.user.getTopArtists({user: username, period: "1month", limit: 15, page: month + 1}, {success: function(data) {
topArtistsByMonth.push(data.topartists);
console.log("Month " + month + ": " + data.topartists);
}});
}
} else {
alert("No username");
}
});
});
</script>
任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
getTopArtists
是异步的,因此仅调用启动请求;它不等待它完成。回调就是你知道什么时候完成的。这意味着你的for
循环将它们全部并行启动,然后在完成后收集结果。但是,由于它们可以按任何顺序完成,因此无法保证topArtistsByMonth
处于任何顺序。要解决这个问题,您可能希望使用显式索引而不是使用push
:
for(var month = 0; month < 12; month++) {
// We need to use an anonymous function to capture the current value of month
// so we don't end up capturing the reference to month that the for loop is
// using (which, by the time the callbacks complete, will always be 12.)
(function(month) {
lastfm.user.getTopArtists({user: username, period: "1month", limit: 15, page: month + 1}, {success: function(data) {
topArtistsByMonth[month] = data.topartists;
console.log("Month " + month + ": " + data.topartists);
}});
})(month);
}
如果您想知道何时下载了所有数据,您将需要另一个变量来跟踪到目前为止已完成的数量。每次调用回调时,你都需要增加它并查看它是否已经命中12。如果有,则已下载所有数据。