Имитация JavaScript-метода setTimeout () «из первых принципов» - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь запустить setTimeout () на веб-сайте через Firefox Scratchpad .Похоже, что в этом конкретном методе JavaScript были различные ошибки в Firefox - и он близнец setInterval().В Firefox v.56 и последней версии Waterfox (обе версии до «Quantum») эти методы JavaScript, похоже, не работают вообще.Напротив, в версиях Firefox «Квант», похоже, он работает ... То есть тот же самый код работает в FF «Квант», который не работает в непосредственном пред-"версии Firefox.И да, я пробовал всевозможных вариаций .

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

Одна мысль состоит в том, чтобы взять текущую дату / время и затем выполнить цикл проверки, чтобы увидеть, скажем, 10Прошло несколько секунд (или 5 минут), прежде чем продолжить дальнейшее выполнение кода / скрипта.

Есть идеи, как эффективно имитировать setTimeout() с помощью JavaScript, но без setTimeout() или setInterval()?


--- EDIT ---

Ложная тревога ... может заставить setInterval() работать встарые браузеры тоже;мой плохой!

(это означает, что причина для того, чтобы задать вопрос, но вопрос как таковой может остаться ...)


--- 2-е РЕДАКТИРОВАНИЕ ---

Принимая во внимание, что setTimeout() работает здесь:

setTimeout(function(){ alert("Hello"); }, 3000);

это не работает /, кажется, здесь игнорируется:

i=0;
while(i < 100)
{
 // window.open("https://www.cnn.com","_self");
 // window.open("https://www.bbc.com","_self");
   // setTimeout(function(){ alert("Hello"); }, 3000);
   setTimeout(function(){ window.open("https://www.bbc.com","_self") }, 3000);
  setTimeout(function(){ window.open("https://www.cnn.com","_self") }, 3000);
  alert(i);
  i++;
}
  // security mgr vetoed ???
  • Почему?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Если вы действительно хотите смоделировать функцию setTimeout без блокировки браузера и т. Д., Вы можете попробовать использовать функцию requestAnimationFrame, чтобы получить некоторую задержку. Должно работать в Firefox 14.0+. Примерно так:

function mySetTimeout (callback, timeout) {
  var startTime = performance.now();

  function mySetTimeoutRec () {
    requestAnimationFrame(function () {
      // This way this function will be called
      // asynchronously around 60 times per second
      // (or less frequently on the inactive tabs).
      // We can check that enough time has passed
      // and call the user callback or this function again.
      var currentTime = performance.now();
      var elapsedTime = currentTime - startTime;

      if (elapsedTime < timeout) {
        mySetTimeoutRec();
      } else {
        callback();
      }
    });
  }

  mySetTimeoutRec();
}

Может использоваться так же, как setTimeout:

mySetTimeout(function () { console.log('Howdy.'); }, 10 * 1000);

В любом случае, вы не должны пытаться делать что-то подобное в большинстве случаев. Если вам кажется, что у вас проблемы с setTimeout, возможно, что-то не так.

0 голосов
/ 12 мая 2018

Одной из возможностей может быть использование сетевого запроса, который занимает переменное количество секунд:

function artificialSetTimeout(fn, timeout) {
  const xhr = new XMLHttpRequest();
  xhr.onreadystatechange = () => {
    if (xhr.readyState === 4 && xhr.status === 200) fn();
  }
  xhr.open('get', 'https://httpstat.us/200?sleep=' + timeout);
  xhr.send();
}


console.log('start');
artificialSetTimeout(() => console.log('end'), 2000);

Не надейтесь, что его время будет совершенно точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...