我正在创建一个名为“你的音乐生活”的应用程序,用户插入他/她的生日,应用程序显示自生日以来每个生日点击的顶部广告牌。该应用程序目前相当慢,因为从Last.fm api检索所有专辑封面图片需要一段时间。我想知道如何使用JS / jQuery加速API调用。似乎线程可以解决这个问题,但我不确定如何实现......
以下是应用:http://www.dailyspiro.com
关键代码:
function compileDisplay(birthDays) {
// create an HTML list that for each birthday displays top song, artist, and album art
htmlObj = {}
for (i = 0; i < birthDays.length; i++) {
var age = birthDays[i][0]; // age isn't equal to i if user was born before 1958
var date = birthDays[i][1];
try {
var track = billboard[date]['song'];
} catch (err) {
console.log(date)
}
var artist = billboard[date]['artist'];
getAlbumArt(age, track, artist, birthDays);
}
}
function getAlbumArt(age, track, artist, birthDays) {
$.getJSON("http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=6ad5bad28ffc4dedbcf1115b3ddf5273&artist=" + artist + "&track=" + track + "&format=json&callback=?", function (data) {
try {
var image = data.track.album.image[2]['#text'];
if (image == 'http://cdn.last.fm/flatness/catalogue/noimage/2/default_album_medium.png') {
throw 'generic image';
}
} catch (err) {
var image = 'images/' + track + '.jpg';
}
compileHtml(age, track, artist, image, birthDays)
})
}
答案 0 :(得分:2)
肯定需要很长时间......特别是像我这样的老朋友!
我建议您开始使用默认图像构建轮播,然后在加载时将它们替换为实际图像。
好主意btw!
答案 1 :(得分:1)
如果API允许(检查用户协议),您可以尝试在服务器上缓存或存储API数据,这样您就不必在每次加载应用程序时都连接到API。
答案 2 :(得分:1)
一般说明:
你错过了很多;在某些行的末尾
birthDays对象的最后一个元素有一个,之后是错误的
birthDays对象很大(如果可以的话,试着找出另一种方法来处理它。
除了上面提到的那些人的建议(特别是@Jason P关于将所有请求合并为一个的评论),我建议如下:
由于birthDays很大,我建议每隔5年或10年创建一个多个对象 这将加快循环
缺点是你现在必须循环多个对象,所以也许你可以组织这样的东西
{d60To65:{........},d65To70:{.......} .....}
加上这会增加代码的复杂性
注意:根据规格,js对象是无序的(内部对象就是这种情况 - 生日)
因此我建议您使用JS Linked List来确保订购
http://www.nczonline.net/blog/2009/04/13/computer-science-in-javascript-linked-list/
5-修复你的循环可能就像这个for (var i = 0, l = birthDay.length; i < l; i++)
6-在函数启动后直接放置变量,而不是在每个循环上创建它们
var age = 0; //number as it can't be otherwise and now you can easily make checks on it
var date = ""; //a string for the same reasons as age
var artist = ""; //same comment
var track = ""; //same comment
关于函数中的变量的相同注释(您可能会在其中找到它们)
7-如果您发现自己使用js日期,可能需要检查Moment.js,因为它有一些实用功能
希望这有帮助
由于某种原因,轮播不在Firefox 22上工作(如果你需要它支持)