ВЫ НЕ МОЖЕТЕ ВОЗВРАЩАТЬ ЗНАЧЕНИЯ ИЗ ФУНКЦИЙ, КОТОРЫЕ ЗАВИСИТ ОТ РЕЗУЛЬТАТА АСИНХРОННЫХ ЗВОНКОВ
Извините за крик, но нужно было сказать ...
лучшее, что вы можете сделать, - это вызвать еще один обратный вызов, как только все остальные будут выполнены.
Все остальное приведет к занятым циклам, что сделает приложение не реагирующим.
Чтобы решить эту проблему (без каламбура), используйте объекты deferred
jQuery:
var defArray = [];
window.each(function(index, element) {
// create a deferred object and store it
var d = $.Deferred();
defArray.push(d);
// trigger the image download
however you do it...
// register a callback for the download completion
// which "resolves" the deferred object
someimg.onload = function() {
d.resolve();
// probably other actions needed here too
}
});
// now call _another_ function once _all_ of the deferreds are resolved
$.when.apply($, defArray).then(function() {
// everything is done - do your calculations
});
Обратите внимание, что моя первая строка все еще остается - вы не можете просто ждать всего, а затем возвращатьрезультат - JS не работает таким образом.
В идеале вы должны создать один объект отложенного добавления, и ваша функция возвратит promise
на основе этого объекта, который в результате вашего окончательного обратного вызова будет resolve
с результатомокончательный расчет.