Функция называя себя не работающий (бесконечный цикл, JavaScript)

Я пытаюсь ожидать и затем получить сообщение, когда все изображения в массиве завершили загрузку (использующий .complete) на ответ здесь. Как таковой я настроил бесконечный цикл как ниже. однако, когда я выполняю это, я получаю ошибку, что checkForAllImagesLoaded () не определяется. Этот код выполняется через bookmarklet и как таковой, он все обернут в конструкции анонимной функции (как ниже). Если я переопределяю свою функцию и переменную за пределами той конструкции, она работает. Но это, кажется, плохой способ записать bookmarklet. Как я могу зафиксировать это так, это все еще распознает функцию после setTimeout?

(function() {

    //var images = array of images that have started loading

    function checkForAllImagesLoaded(){
        for (var i = 0; i < images.length; i++) {
            if (!images[i].complete) {
               setTimeout('checkForAllImagesLoaded()', 20);
               return;
            }
        }
    }

    checkForAllImagesLoaded();

})();

8
задан Community 23 May 2017 в 10:24
поделиться

3 ответа

Удалите вызов функции и удалите кавычки. Если вы не поместите кавычки, setTimeout получит прямую ссылку на функцию, которую он может вызвать позже. Однако, если внутри строки, такой как «checkForAllImagesLoaded» или «checkForAllImagesLoaded ()» , тогда он выполнит переданный код по истечении времени ожидания.

В это время будет выполняться поиск checkForAllImagesLoaded в глобальном объекте (окне), но он там не определен, причина в том, что вы получаете ошибку undefined .

Ваш код заключен в самовызывающуюся анонимную функцию, и вне ее checkForAllImagesLoaded не существует. Поэтому передайте прямую ссылку на функцию в вызове setTimeout вместо строки.

setTimeout(checkForAllImagesLoaded, 20);

setTimeout может быть вызван либо функцией (и необязательными аргументами), либо строкой, содержащей код JavaScript:

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);
8
ответ дан 5 December 2019 в 17:33
поделиться

С помощью кода вы устанавливаете количество тайм-аутов для каждого звонка. Вам следует просто установить тайм-аут один раз для каждого вызова checkForAllImagesLoaded () и, возможно, увеличить период ожидания (20 миллисекунд - это слишком быстро). Например.

function checkForAllImagesLoaded() {
  var allComplete=true;
  var i=0;

  while (i<images.length && allComplete) {
    allComplete=images[i++].complete;
  }

  if (!allComplete) { // Any incomplete images?
    setTimeout('checkForAllImagesLoaded()',1000); // Wait a second!
  }
}
1
ответ дан 5 December 2019 в 17:33
поделиться

Удалите () в вызове settimeout.

setTimeout ('checkForAllImagesLoaded', 20);

1
ответ дан 5 December 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: