@mumus

Как пытаться поочерёдно загружать изображения, до первого успешно загруженного?

Как загрузить изображения поочередно, если одно не загрузилось, то грузить второе и т.д.?
Есть массив из 4 адресов (обложек видео от ютюба). Сначала грузить первую maxresdefault, если ее нет или она не загрузилась, то грузить вторую и т.д.

const resolutions = ['maxresdefault', 'hqdefault', 'mqdefault', 'sddefault'];
let videoId = 'dQw4w9WgXcQ';

resolutions.forEach(item => {
  let url = 'https://i.ytimg.com/vi/'+videoId+'/'+item+'.jpg';
  loadImage(url)
    .then((img) => {console.log('img ', img); document.body.append(img)})
    .catch(error => console.error('error ', error));
});

function loadImage(url){
    return new Promise((resolve, reject) => {
        const img = new Image();
        img.addEventListener('load', e => {
            img.naturalWidth <= 240 ? reject(new Error('No image found')) : resolve(img);
        });
        img.addEventListener('error', () => {
            reject(new Error(`Failed to load image's URL: ${url}`));
        });
        img.src = url;
    });
}
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Асинхронная функция, внутри цикл:

async function getFirstLoadedImage(urls) {
  for (const n of urls) {
    try {
      return await loadImage(n);
    } catch (e) {}
  }

  throw 'ничего загрузить не удалось';
}

Или, рекурсия:

const getFirstLoadedImage = (urls, i = 0) => i < urls.length
  ? loadImage(urls[i]).catch(() => getFirstLoadedImage(urls, -~i))
  : Promise.reject('ничего загрузить не удалось');

Пользоваться этим, понятное дело, так:

getFirstLoadedImage(resolutions.map(n => `https://i.ytimg.com/vi/${videoId}/${n}.jpg`))
  .then(img => document.body.append(img))
  .catch(console.error);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AlexMaxTM
@AlexMaxTM
Это ТЗ или вопрос?
Если это ТЗ, тогда не хватает конкретики.
Если вопрос, тогда в нем не хватает того кода, который вы написали.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект