我有一个从 API 中提取图像以将它们插入动画滚动条的函数。它看起来像这样(为清楚起见进行了简化):
function getPhotos(id) {
$.when(Service.getPhotos(id))
.then(function(results) {
var photos = results.photos,
scroller = $("#scroller");
// Add the photos to the scroller
for (var i = 0; i < photos.length; i++) {
var photo = photos[i].url;
// Only add a photo if its URL is valid
if (photoExists(photo) == 200) {
scroller.append("<li><img src='" + photo + "' /></li>");
} else {
console.log("Photo " + photo + " doesn't exist");
}
}
})
.fail(function(err) {
console.log(err);
});
}
但是,照片 URL 并不总是解析为有效图像,因此我通过photoExists()
函数运行它们:
function photoExists(photo) {
var http = jQuery.ajax({
type: "HEAD",
url: photo,
async: false
});
return http.status;
}
如果给定的照片 URL 返回状态码200
,那么我知道该图像存在并将其插入到滚动条中;否则,我会跳过它,以免插入损坏的图像。
这里的问题是async: false
——因为这不是异步的,所以整个 UI 都会锁定,直到一切都完成,这可能需要很长时间,具体取决于我必须循环遍历多少照片 URL。
但是,如果我使用async: true
,则该photoExists()
函数会在 AJAX 请求本身实际完成之前尝试返回状态代码 - 所以photoExists(photo)
永远不会返回200
,从而不会将任何内容添加到滚动条中。
我将如何调整它以便photoExists()
可以异步运行,从而避免锁定 UI,但仍然返回正确的状态代码,以便我可以将照片正确插入到滚动条中?