JavaScript, дождитесь изменения значения цикла

1

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

var google = false;
  function test(check = false) {
    if (!check) {
      console.log('append the api');

      check = true;
    }
    if (check) {
      console.log('check api is loaded');
      if(!google){
        console.log('not loaded');
        setTimeout(test(true), 10000);
        return;
      } else {
        console.log('loaded');
      }
    }
  }

Этот код должен просто отображать 2 console.log, пока переменная google не будет изменена на true.

Я не могу изменить это, так как браузер зависает из-за большого количества циклов.

  • 3
    setTimeout (test (true), 1000) => setTimeout (test, 1000, true);
  • 0
    Сделайте минимальный воспроизводимый пример . Уменьшите сложность и попробуйте снова.
Показать ещё 2 комментария
Теги:

3 ответа

1
Лучший ответ

Поскольку Jonas w сказал, что вы должны использовать setTimeout(test,1000,true) вместо setTimeout(test(true),1000), см. Объяснение ниже:

Согласно MDN WindowOrWorkerGlobalScope.setTimeout() вы должны передать три переменные в setTimeout: function, timeout value и parameters которые будут переданы вызываемой функции. Функции в JavaScript являются объектами первого класса, поэтому вы передаете их как обычный объект. В вашем примере вы фактически не передаете функцию, но сразу вызываете ее и передаете значение setTimeout которое возвращается из этой функции.

2

Вы ошибаетесь в этой строке:

setTimeout(test(true), 10000);

Вы должны передать функцию и не называть ее. Если вы хотите передать параметры, сделайте это так:

setTimeout(function(){test(true)}, 10000);
0

Вы рекурсивно вызываете test функцию немедленно, потому что вы на самом деле устанавливаете тайм-аут для значения, возвращаемого test, которое не определено.

Вы хотите поместить test(true) в анонимную функцию, например:

var google = false;
function test(check = false) {
  if (!check) {
    console.log('append the api');
    check = true;
  }
  if (check) {
    console.log('check api is loaded');
    if(!google){
      console.log('not loaded');
      setTimeout(() => test(true), 10000);
      return;
    } else {
      console.log('loaded');
    }
  }
}

Обратите внимание на стрелку () => - это создает анонимную функцию, которая вызывается, когда истекает время ожидания. Если вам не нравится использовать эту новую функцию функции со стрелкой, вы также можете написать:

var google = false;
function test(check = false) {
  if (!check) {
    console.log('append the api');
    check = true;
  }
  if (check) {
    console.log('check api is loaded');
    if(!google){
      console.log('not loaded');
      setTimeout(function () {
        test(true);
      }, 10000);
      return;
    } else {
      console.log('loaded');
    }
  }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню