Вопрос: Что такое JavaScript-версия sleep ()?


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

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

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


1469


источник


Ответы:


2017 обновление

С 2009 года, когда был задан этот вопрос, JavaScript значительно изменился. Все остальные ответы теперь устарели или слишком сложны. Вот текущая лучшая практика:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two second later');
}

demo();

Это оно. await sleep(<duration>),

Вы можете попробовать этот код в прямом эфире на Runkit , Обратите внимание, что,

  1. awaitможет выполняться только в функциях с префиксом asyncключевое слово. Runkit завершает ваш код в асинхронной функции перед его выполнением.
  2. awaitтолько приостанавливает текущий asyncфункция

Две новые функции JavaScript помогли написать настоящую функцию «сна»:

Совместимость

Если по какой-то причине вы используете Node старше 7 или используете таргетинг на старые браузеры, async/ awaitвсе еще можно использовать через галдеж (инструмент, который transpile JavaScript + новые функции в простой старый JavaScript), с transform-async-to-generatorплагин , Бег

npm install babel-cli --save

Создайте .babelrcс:

{
  "plugins": [
    "transform-async-to-generator",
  ]
}

Затем запустите свой код с помощью

node_modules/babel-cli/bin/babel-node.js sleep.js

Но опять же, вам это не нужно, если вы используете Node 7 или более позднюю версию, или если вы ориентируетесь на современные браузеры.


985



(См. обновленный ответ на 2016 год )

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

Проблема здесь в том, что JavaScript является однопоточной моделью на основе событий. Хотя в конкретном случае было бы неплохо заставить весь двигатель ждать несколько секунд, в общем, это плохая практика. Предположим, я хотел использовать ваши функции при написании собственных? Когда я позвоню вашему методу, мои методы все замерзнут. Если JavaScript каким-то образом сохранит контекст выполнения вашей функции, сохраните его где-нибудь, затем верните его и продолжите позже, а затем сон может произойти, но это будет в основном потоком.

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

Тогда ваш вопрос немного ложный. Невозможно спать так, как вы хотите, и не следует предлагать решение, которое вы предлагаете.


829



В JavaScript я переписываю каждую функцию так, чтобы она могла завершиться как можно скорее. Вы хотите, чтобы браузер снова контролировался, чтобы он мог внести изменения в DOM.

Каждый раз, когда мне хотелось поспать посреди моей функции, я реорганизовал setTimeout(),

Я собираюсь отредактировать этот ответ, потому что нашел это полезным:

Печально известный сон, или задержка, функционирует на любом языке, много обсуждается. Некоторые скажут, что всегда должен быть сигнал или обратный вызов для запуска данной функции, другие будут утверждать, что иногда произвольный момент задержки полезен. Я говорю, что каждому свое и одно правило никогда не может диктовать что-либо в этой отрасли.

Написание функции сна простое и сделанное еще более пригодным для использования с обещаниями JavaScript:

// sleep time expects milliseconds
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

// Usage!
sleep(500).then(() => {
    // Do something after the sleep!
});

584



Только для debug / dev , Я публикую это, если это полезно кому-то

Интересный материал, в Firebug (и, возможно, другие консоли js), ничего не происходит после входа в игру, только после того, как указанная продолжительность сна (...)

function sleepFor( sleepDuration ){
    var now = new Date().getTime();
    while(new Date().getTime() < now + sleepDuration){ /* do nothing */ } 
}

Пример использования:

function sleepThenAct(){ sleepFor(2000); console.log("hello js sleep !"); }

266



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

Однако setTimeout не выполняет выполнение, он выполняет следующую строку функции сразу после таймаута SET, а не после истечения таймаута, так что не выполняет ту же задачу, что и сон.

Способ сделать это - разбивать вашу функцию на до и после частей.

function doStuff()
{
  //do some things
  setTimeout(continueExecution, 10000) //wait ten seconds before continuing
}

function continueExecution()
{
   //finish doing things after the pause
}

Убедитесь, что имена ваших функций по-прежнему точно описывают, что делает каждая часть (I.E.GatherInputThenWait и CheckInput, а не funcPart1 и funcPart2)

редактировать

Этот метод достигает цели не выполнять строки кода, которые вы решаете, до ПОСЛЕ вашего таймаута, все еще возвращая управление обратно на клиентский ПК, чтобы выполнить все остальное, что он поставил в очередь.

Дальше Править

Как указано в комментариях, это абсолютно НЕ РАБОТАЕТ в цикле. Вы могли бы сделать какой-то причудливый (уродливый) взлом, чтобы заставить его работать в цикле, но в целом это будет просто для катастрофического кода спагетти.


163



Для любви к $ DEITY, пожалуйста, не выполняйте функцию ожидания ожидания ожидания. setTimeoutа также setIntervalсделайте все, что вам нужно.


110



Я знаю, что это немного старый вопрос, но если (как я) вы используете Javascript с Rhino, вы можете использовать ...

try
{
  java.lang.Thread.sleep(timeInMilliseconds);
}
catch (e)
{
  /*
   * This will happen if the sleep is woken up - you might want to check
   * if enough time has passed and sleep again if not - depending on how
   * important the sleep time is to you.
   */
}

109



If you're using jQuery, someone actually created a "delay" plugin that's nothing more than a wrapper for setTimeout:

// Delay Plugin for jQuery
// - http://www.evanbot.com
// -  2008 Evan Byrne

jQuery.fn.delay = function(time,func){
    this.each(function(){
        setTimeout(func,time);
    });

    return this;
};

You can then just use it in a row of function calls as expected:

$('#warning')
.addClass('highlight')
.delay(1000)
.removeClass('highlight');

65



I've searched for sleep solution too (not for production code, only for dev/tests) and found this article:

http://narayanraman.blogspot.com/2005/12/javascript-sleep-or-wait.html

...and here's another link with client-side solutions: http://www.devcheater.com/

Also, when you are calling alert(), your code will be paused too, while alert is shown -- need to find a way to not display alert but get the same effect. :)


43



Here you go. As the code says, don't be a bad dev and use this on websites. It's a development utility function.

// Basic sleep function based on ms.
// DO NOT USE ON PUBLIC FACING WEBSITES.
function sleep(ms) {
    var unixtime_ms = new Date().getTime();
    while(new Date().getTime() < unixtime_ms + ms) {}
}

29



Here's a simple solution using a synchronous XMLHttpRequest:

function sleep(n){
  var request = new XMLHttpRequest();
  request.open('GET', '/sleep.php?n=' + n, false);  // `false` makes the request synchronous
  request.send(null);
}

contents of sleep.php:

<?php sleep($_GET['n']);

Now call it with: sleep(5);


23