Цикл загрузки изображений, одно за другим, только после полной загрузки предыдущего

#javascript #html #asynchronous #load

Вопрос:

Как следует из названия, у меня есть список изображений, которые я хочу загрузить. У меня есть функция, которая при заданном числовом значении от 1 до 1000 (приблизительно) изменяет источник объекта изображения в моем html-документе на желаемое имя изображения. Это числовое значение сохраняется в глобальной переменной, которая может время от времени меняться, а затем, вызывая эту функцию, фактический src изображения также изменится.

Например:

 if ( myImage == 1)
    document.getElementById("mainImage").src = "snow.bmp";
else if ( myImage == 2)
    document.getElementById("mainImage").src = "desert.bmp";
else if ( myImage == 3)
    document.getElementById("mainImage").src = "forest.bmp";
 

И так далее. Я знаю, что это можно сделать более привлекательным способом, а не использовать if-else каждый раз, но это не моя текущая проблема.

Что я заметил, так это то, что каждое изображение загружается во время моего основного index.html при размещении на удаленных серверах (локально оно загружается быстро), поэтому, чтобы преодолеть это, я хотел предварительно загрузить все изображения с хорошей полосой продвижения сбоку или какой-нибудь цифровой дорожкой.

Для этого я создал отдельный html-файл, который будет своего рода вступлением. Я хочу перебрать все возможные числовые значения, скажем, в диапазоне 1 до 1000 . Каждый раз обновляйте myImage , чтобы это значение было таким. После присвоения значения вызывается myImage функция makeImage() , которая находится if-else сверху. Затем фактический источник mainImage изменяется соответствующим образом. Это завершает одну итерацию. Только после того, как изображение будет загружено пользователю, я хочу перейти к следующему значению в диапазоне [1,1000] . Я пытался читать в Интернете о wait и async и обещаниях, но не смог реализовать это для моего случая.

До сих пор мой код построен из основного метода загрузки:

 async function loadAllImages()
            {
                for(var valueOfCell = 1; valueOfCell <= 1000; valueOfCell   )
                {
                    myImage = valueOfCell;
                    makeImage();
                    let loadedImage = await loadImage();
                }
            }
 

И функция ожидания заключается в:

 function loadImage() {
                const img = new Image();
            
            
                return new Promise((resolve, reject) => {
                  img.addEventListener("load", () => {
                    resolve();
                  });
            
                  img.addEventListener("error", () => {
                    reject();
                  });
            
                  img.src = document.getElementById("mainImage").src;
                });
            }
 

Одна из проблем заключается в том, что я использую Image объект, который, честно говоря, мне не нужен. Я мог бы также сказать, что приведенный выше код скомбинирован из материалов, которые я нашел в Интернете, я просто не был уверен, как их использовать await .

Я был бы очень рад, если бы кто-нибудь мог помочь мне в этом, особенно чтобы понять, как использовать await и как использовать его в моем случае.

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

1. Не связано с вопросом JS, но я заметил, что вы используете изображения BMP. Формат BMP несжат, поэтому изображения получаются огромными. Например, вы можете преобразовать файл в формат PNG , чтобы уменьшить размер и время загрузки.

2. Да, я думаю, что сделаю это @Vitalii.