【发布时间】:2013-08-13 17:46:55
【问题描述】:
我正在制作一个名为“Your Life in Music”的应用程序,用户在其中插入他/她的生日,该应用程序会显示自他们出生以来每个生日的热门广告牌。该应用程序目前非常慢,因为从 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)
})
}
【问题讨论】:
-
这取决于服务 api .. 这不取决于你 .. 不能用 javascript 加速它。
-
ajax 调用已经是异步的,看起来你并没有在任何地方阻塞。您可以查看浏览器工具的网络选项卡,了解每个请求实际花费了多长时间。
-
API 调用已经是并行的(但很多,不确定是否可以优化)。然而,您的应用程序感觉缓慢似乎来自轮播脚本等待所有图像加载(这需要相当长的时间)
-
您可以做的一件事是为所有可能的生日预加载数据——也许一旦他们填写了月份,而不是当天,开始获取该月所有日子的 JSON?不过,他们可能不喜欢你一次访问他们的服务器 30 次。
-
看起来您的 javascript 大约需要 140 毫秒,而 ajax 调用(对我来说)大约需要 1.5 秒。所以花费的时间是在显示轮播之前加载图像。如果您可以将所有 API 调用合并到一个请求中,您可能需要一秒钟左右的时间。您也可以尝试在以某种方式显示轮播之前不要等待所有图像加载。
标签: javascript jquery performance api