Метод загрузки изображений Javascript — обнаружение ошибок

#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 @Prakhar

3. Это не работает, ошибка не попадает в блок catch.

4. Я слишком много думал о вашем исходном коде — не заметил попытку/уловку внутри исполнителя обещания — Я переписал код, теперь он должен работать — также есть проверка, чтобы увидеть, имеет ли изображение ширину и высоту

5. Я не думаю, что он когда-либо входит в изображение.загружается, когда это не изображение. Отказ от else, похоже, никогда не выполняется. Ни один из них не идет на улов во время загрузки другими способами.