#javascript
Вопрос:
Эта getSizeFromObjectUrl
функция () хорошо работает для вычисления высоты и ширины для реальных изображений. Я пробовал это с файлами (объектами), отличными от изображений (например, текстовыми файлами), код никогда не достигает блока catch в try-catch. С помощью каких способов можно перехватывать ошибки/исключения загрузки img.onload
?
function getSizeFromObjectUrl(dataURL: string): Promise<{ width: number; height: number }> {
return new Promise((resolve) => {
try {
const img = new Image();
img.onload = () => {
const ratio = Math.min(maxImageWidth / img.width, maxImageHeight / img.height, 1);
resolve({
width: img.width * ratio,
height: img.height * ratio
});
};
img.src = dataURL;
} catch (exception) {
logCalculateImageSizeFailed(exception);
// handle error
}
});
}
Ответ №1:
Используйте отклонение обещания для img.onerror
примечание, добавлен reject
аргумент для обратного вызова исполнителя обещания — см. Комментарии в коде
function getSizeFromObjectUrl(dataURL: string): Promise<{width: number;height: number}> {
return new Promise((resolve, reject) => { // amended this line
const img = new Image();
img.onerror = reject; // added this line
img.onload = () => {
const ratio = Math.min(maxImageWidth / img.width, maxImageHeight / img.height, 1);
if (img.width amp;amp; img.height) {
resolve({
width: img.width * ratio,
height: img.height * ratio
});
} else {
reject('Bad Image');
}
};
img.src = dataURL;
}).catch(exception => {
logCalculateImageSizeFailed(exception);
// handle error
});
}
Комментарии:
1. Знаем ли мы причину ошибки? Как и любая другая ошибка/исключение?
2. Если вы потрудились запустить код, вы увидите ошибку в
catch
@Prakhar3. Это не работает, ошибка не попадает в блок catch.
4. Я слишком много думал о вашем исходном коде — не заметил попытку/уловку внутри исполнителя обещания — Я переписал код, теперь он должен работать — также есть проверка, чтобы увидеть, имеет ли изображение ширину и высоту
5. Я не думаю, что он когда-либо входит в изображение.загружается, когда это не изображение. Отказ от else, похоже, никогда не выполняется. Ни один из них не идет на улов во время загрузки другими способами.