Смешивание процедур и событий

#javascript #events #procedure

#javascript #Мероприятия #процедура

Вопрос:

У меня есть функция, которая загружает изображение и проверяет, успешно ли оно загружается. (Чтобы узнать, поддерживает ли браузер WebP)

Проблема в том, что для этого мне приходится использовать onload() и onerror(), а это значит, что я не могу просто вернуть значение.

Как я могу отложить возврат до запуска события?

Вот мой код:

 function start_check_webp(){
  var div = document.createElement('div');
  div.innerHTML = '<img id = "test_image" src="test_image.webp">';
  webp_test = div.firstChild;
  div.firstChild.onerror = function(){support_webp = false}
  div.firstChild.onload = function(){support_webp = true}
}
  

Ответ №1:

Вы не можете. Вам нужно будет реструктурировать свой код для обработки асинхронных событий. Вместо того, чтобы ваши обработчики событий устанавливали переменную, вы могли бы заставить их вызывать функцию, которая действительно что-то делает, если поддерживается WebP или иным образом.

Комментарии:

1. Хорошо … это был мой другой вариант, но я предпочел получить значение «да» / «нет». Просто для проверки, нет никакого способа узнать, не удалась ли загрузка изображения без использования событий, не так ли?

2. @snostorm: К сожалению, нет. Браузеру необходимо сначала загрузить изображение с сервера, что обязательно делает его асинхронным. (В JavaScript нет блокирующих вызовов.)

Ответ №2:

Структурируйте свой код так, чтобы он выполнялся после загрузки изображения. Вы можете ускорить процесс, используя URI данных вместо внешнего изображения, например

 function testWepP() {
  var webP = new Image();     
  webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIAL'   
    'mk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
  webP.onload = webP.onerror = function () {
     callback(webP.height === 2);     
  }; 
};

testWebP(function(supported) {
  console.log((supported) ? "webP supported!" : "webP not supported."); 
});