я предзагрузка изображения со следующим кодом:Resolve обещание, когда все изображения будут загружены
function preLoad() {
var deferred = $q.defer();
var imageArray = [];
for (var i = 0; i < $scope.abbreviations.length; i++) {
imageArray[i] = new Image();
imageArray[i].src = $scope.abbreviations[i].imgPath;
}
imageArray.forEach.onload = function() {
deferred.resolve();
console.log('Resolved');
}
imageArray.forEach.onerror = function() {
deferred.reject();
console.log('Rejected')
}
return deferred.promise;
}
preLoad();
Я думал, что изображения были загружаются правильно, потому что я мог видеть «Решен» журнал.
Позже кто-то указал, что приведенный выше код не гарантирует, что все изображения загружены до разрешения обещания. Фактически, разрешено только первое обещание.
Мне было рекомендовано использовать $q.all
вместо массива обещаний. Это результирующий код:
function preLoad() {
var imageArray = [];
var promises;
for (var i = 0; i < $scope.abbreviations.length; i++) {
imageArray[i] = new Image();
imageArray[i].src = $scope.abbreviations[i].imgPath;
};
function resolvePromises(n) {
return $q.when(n);
}
promises = imageArray.map(resolvePromises);
$q.all(promises).then(function (results) {
console.log('array promises resolved with', results);
});
}
preLoad();
Это работает, но я хочу, чтобы понять:
- что происходит в каждой функции;
- , почему мне нужно
$q.all
, чтобы убедиться, что все изображения загружены до разрешения обещаний.
relevant docs несколько загадочны.
Откуда у вас это 'imageArray.forEach.onload'? –
@HenriqueBarcelos, вы имеете в виду, что это должно быть 'imageArray.onload' вместо этого? –
Интересно, почему вы говорите о «первом обещании» ... в вашем первом фрагменте есть только одно обещание. – Bergi