Что такое JavaScript-версия sleep ()? - PullRequest
1903 голосов
/ 04 июня 2009

Есть ли лучший способ создать sleep в JavaScript, чем следующая pausecomp функция ( взято отсюда )?

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}

Это не дубликат Сон в JavaScript - задержка между действиями ; Мне нужен реальный сон в середине функции, а не задержка перед выполнением фрагмента кода.

Ответы [ 73 ]

0 голосов
/ 31 мая 2016

Это может сработать. У меня это сработало в c и javascript.

function sleep(time) {
 var x = 0;
 for(x = 0;x < time;x++) {/* Do nothing*/}
}
0 голосов
/ 27 июня 2017

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

Каждое решение, которое я читал до сих пор, было бы похоже на «давай спать и посмотрим, что случилось завтра».

setInterval (обратный вызов, время) будет долго ждать, а затем обратный вызов, в то время как блокировка времени выполнения. Текущая реализация "setInterval" далека от сохранения потока, даже не говоря уже о параллелизме.

Несмотря на то, что упомянутые разреженные решения выглядят как угадайте, C # ( смеется ), они все еще не работают, как в C # /. NET. Они все еще работают как в C.

JavaScript в настоящее время НЕ предоставляет архитектуру для реализации многопоточности. Лучшим подходом был бы TypeScript, но все же в нем так мало реального решения, что ... больно. JavaScript, JQuery, AJAX, JNode и даже TypeScript - это всего лишь группа Wannabes, полагающихся на благо и плохое настроение разработчиков. Факт. Полная остановка.

0 голосов
/ 02 июля 2016

Используйте три функции:

  1. Функция, которая вызывает setInterval для запуска цикла
  2. Функция, которая вызывает clearInterval для остановки цикла, затем вызывает setTimeout для сна и, наконец, вызывает в setTimeout в качестве обратного вызова для перезапуска цикла
  3. Цикл, который отслеживает количество итераций, устанавливает номер ожидания и максимальное число, вызывает функцию ожидания после достижения номера ожидания и вызывает clearInterval после достижения максимального числа

var foo = {};

function main()
  {
  'use strict';
  /*Initialize global state*/
  foo.bar = foo.bar || 0;
  /* Initialize timer */ 
  foo.bop = setInterval(foo.baz, 1000); 
  }
 
 sleep = 
      function(timer)
      {
      'use strict';
      clearInterval(timer);
      timer = setTimeout(function(){main()}, 5000);
      };
       
 
 foo.baz = 
   function()
      {
      'use strict';
      /* Update state */
      foo.bar = Number(foo.bar + 1) || 0; 
      /* Log state */
      console.log(foo.bar);
      /* Check state and stop at 10 */ 
      (foo.bar === 5) && sleep(foo.bop);
      (foo.bar === 10) && clearInterval(foo.bop);
      };
      
main();

Event Loop

Ссылки

0 голосов
/ 28 сентября 2017

Чтобы основной поток был занят в течение нескольких миллисекунд:

function wait(ms) {
  const start = performance.now();
  while(performance.now() - start < ms);
}
0 голосов
/ 28 марта 2019

Проблема с использованием реальной функции сна состоит в том, что JavaScript является однопоточным, и функция сна в значительной степени заставит ваш браузер зависать на это время.

0 голосов
/ 11 января 2019

Я предпочитаю этот функциональный стиль sleep Функция:

const sleep = ms =>
    Promise(resolve => setTimeout(resolve, ms))
0 голосов
/ 10 апреля 2015

Вот способ спать в .hta сценарии, так что когда сценарий просыпается, он выполняет следующую команду в последовательности, как это необходимо в цикле. Это настоящий сон; он не удерживает процессор во время сна. Например. процессор может загружать и отображать страницы во время сна.

Только один раз, в начале кода, перейдите

var WSHShell = new ActiveXObject ("WScript.Shell");

Для сна, например 1 секунда = 1000 миллисекунд, выполнить оператор

WSHShell.Run ('Sleep.js 1000', 3, true);

В том же каталоге, что и скрипт, находится файл Sleep.js, который содержит одну следующую строку:

WScript.Sleep (WScript.Arguments (0));

(Осторожно; 0 в скобках, а не в скобках.) Последняя строка, которая фактически выполняет сон. Аргумент true в предыдущем фрагменте делает вызов синхронным. Кажется, что 3 в предыдущем аргументе не имеет никакого эффекта, но вам нужен какой-то аргумент, чтобы true был третьим аргументом. Microsoft говорит: «Объект WScript ... никогда не нужно создавать, прежде чем вызывать его свойства и методы, и он всегда доступен из любого файла сценария», но это не так. Он доступен в автономном файле .js, таком как выше, но, очевидно, не в файле .js, используемом файлом .hta, поэтому он должен быть в отдельном файле, который вызывается, как указано выше.

0 голосов
/ 05 октября 2018

Очень простой способ сделать сон, который будет совместим со всем, что запускает Javascript ... Этот код был протестирован с чем-то вроде 500 записей, использование ЦП и памяти все еще не видно в моих веб-браузерах.

Здесь одна функция, которая ждет, пока узел не станет видимым ...

Эта функция создает новый контекст function () {}, чтобы избежать рекурсии. Мы поместили код, который делает то же самое, что и код вызывающей стороны, в этот новый контекст. Мы используем функцию Timeout для вызова нашей функции через несколько секунд.

var get_hyper = function (node , maxcount , only_relation) {
    if (node.offsetParent === null) {
            // node is hidden
            setTimeout(function () { get_hyper(node , maxcount , only_relation)}
                      ,1000);
            return;
    };

    // Enter here the code that wait that that the node is visible
    // before getting executed.

};
0 голосов
/ 02 августа 2013
var waitTillSomethingHappens = function(){  
    if(somethingHappened == 1)  
    {  
        alert('Something Happened get out of sleep');  
    }
    else
    {  
    setTimeout(waitTillSomethingHappens,1000);  
    }  
};
0 голосов
/ 26 февраля 2019

Я получил Promise не конструктор, использующий верхний ответ. Если вы импортируете Bluebird, вы можете сделать это. Самое простое решение ИМО.

import * as Promise from 'bluebird';


  await Promise.delay(5000)
...