为什么加载失败,因此 promise 没有得到解决?
Why loading fails and consequently promises don't get resolved?
此代码段是更大指令的一部分:
var imageArray = [];
for (var i = 0; i < $scope.abbreviations.length; i++) {
imageArray[i] = new Image();
imageArray[i].src = $scope.abbreviations[i].imgPath;
};
console.log(imageArray);
function preLoad() {
var promises = [];
function loadImage(src) {
return $q(function (resolve, reject) {
var image = new Image();
image.src = src;
image.onload = function () {
resolve(image);
console.log('onload:', src);
};
image.onerror = function (e) {
reject(e);
console.log('onerror:', e);
};
})
}
imageArray.forEach(function (src) {
console.log('forEach:', src);
promises.push(loadImage(src));
});
return $q.all(promises).then(function (results) {
console.log('Promises resolved with', results);
$scope.results = results;
});
}
preLoad().then(function () {
console.log('Ready for next activity...');
});
此屏幕截图显示了我的控制台中的日志:
问题:为什么加载函数失败,结果是 promise 没有得到解决?
问题出在这里:
imageArray.forEach(function(src) {
...
}
您将 imageArray
的元素传递给 forEach
回调 - 但那 已经是 一个 Image 对象。这就是为什么当您将它分配到新图像的 src 时,加载失败的原因。
最简单的解决方案是在代码开头跳过该循环,并增加 forEach
回调,以便它与原始对象一起使用。事实上,使用 .map
返回结果更干净:
promises = $scope.abbreviations.map(function(imgObj) {
return loadImage(imgObj.imgPath);
});
此代码段是更大指令的一部分:
var imageArray = [];
for (var i = 0; i < $scope.abbreviations.length; i++) {
imageArray[i] = new Image();
imageArray[i].src = $scope.abbreviations[i].imgPath;
};
console.log(imageArray);
function preLoad() {
var promises = [];
function loadImage(src) {
return $q(function (resolve, reject) {
var image = new Image();
image.src = src;
image.onload = function () {
resolve(image);
console.log('onload:', src);
};
image.onerror = function (e) {
reject(e);
console.log('onerror:', e);
};
})
}
imageArray.forEach(function (src) {
console.log('forEach:', src);
promises.push(loadImage(src));
});
return $q.all(promises).then(function (results) {
console.log('Promises resolved with', results);
$scope.results = results;
});
}
preLoad().then(function () {
console.log('Ready for next activity...');
});
此屏幕截图显示了我的控制台中的日志:
问题:为什么加载函数失败,结果是 promise 没有得到解决?
问题出在这里:
imageArray.forEach(function(src) {
...
}
您将 imageArray
的元素传递给 forEach
回调 - 但那 已经是 一个 Image 对象。这就是为什么当您将它分配到新图像的 src 时,加载失败的原因。
最简单的解决方案是在代码开头跳过该循环,并增加 forEach
回调,以便它与原始对象一起使用。事实上,使用 .map
返回结果更干净:
promises = $scope.abbreviations.map(function(imgObj) {
return loadImage(imgObj.imgPath);
});