Вы не должны делать ничего синхронного (даже AJAX) вызовов, вместо этого просто поместите свой код в соответствующий обратный вызов:
function loadSprite(src, callback) {
var sprite = new Image();
sprite.onload = callback;
sprite.src = src;
}
Тогда используйте это так:
loadSprite('sprites/sheet1.png', function() {
// code to be executed later
});
Если вы хотите передать дополнительные аргументы, вы можете сделать это следующим образом:
sprite.onload = function() {
callback(whatever, args, you, have);
};
Если вы хотите загрузить несколько элементов и хотите дождаться завершения всех из них, рассмотрите возможность использования объекта jQuery deferred :
function loadSprite(src) {
var deferred = $.Deferred();
var sprite = new Image();
sprite.onload = function() {
deferred.resolve();
};
sprite.src = src;
return deferred.promise();
}
В функции загрузки спрайтов вы делаете что-то вроде этого:
var loaders = [];
loaders.push(loadSprite('1.png'));
loaders.push(loadSprite('2.png'));
loaders.push(loadSprite('3.png'));
$.when.apply(null, loaders).done(function() {
// callback when everything was loaded
});
http://api.jquery.com/jQuery.when/