Есть ли лучший способ создать sleep
в JavaScript, чем следующая pausecomp
функция ( взято здесь )?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
Это не дубликат Sleep в JavaScript - задержка между действиями ; Мне нужен настоящий сон в середине функции, а не задержка перед выполнением фрагмента кода.
javascript
sleep
фмсф
источник
источник
Ответы:
2017 - 2019 обновление
С 2009 года, когда был задан этот вопрос, JavaScript значительно эволюционировал. Все остальные ответы сейчас устарели или слишком сложны. Вот текущая лучшая практика:
Это оно.
await sleep(<duration>)
,Или как однострочник:
Обратите внимание, что,
await
может выполняться только в функциях с префиксомasync
ключевого слова или на верхнем уровне вашего сценария в некоторых средах (например, консоль Chrome DevTools или Runkit).await
только приостанавливает текущуюasync
функциюДве новые функции JavaScript помогли написать эту «спящую» функцию:
async/await
функция позволяет коду явно ожидать выполнения обещания (разрешить или отклонить).Совместимость
async
/await
приземлился в V8 и был включен по умолчанию с Chrome 55 (выпущен в декабре 2016 года)Если по какой-то странной причине вы используете Node старше 7 лет ( срок действия которого истек ) или нацелены на старые браузеры, то
async
/await
все еще можно использовать через Babel (инструмент, который перенесет JavaScript + новые функции в обычный старый JavaScript) , сtransform-async-to-generator
плагином.источник
(См. Обновленный ответ за 2016 год )
Я думаю, что вполне разумно хотеть выполнить действие, подождать, а затем выполнить другое действие. Если вы привыкли писать на многопоточных языках, у вас, вероятно, есть идея дать выполнение за определенное время, пока ваш поток не проснется.
Проблема здесь заключается в том, что JavaScript является однопоточной моделью, основанной на событиях. Хотя в конкретном случае было бы неплохо подождать всего несколько секунд, но в целом это плохая практика. Предположим, я хотел использовать ваши функции, когда писал свои собственные? Когда я вызывал твой метод, все мои методы зависали. Если JavaScript может каким-то образом сохранить контекст выполнения вашей функции, сохранить его где-нибудь, затем вернуть обратно и продолжить позже, тогда может произойти сон, но это в основном будет потоковым.
Таким образом, вы в значительной степени застряли на том, что предложили другие - вам нужно разбить ваш код на несколько функций.
Тогда ваш вопрос немного ошибочен. Нельзя спать так, как вы хотите, и вы не должны следовать предложенному вами решению.
источник
sleep()
в JS это невозможно, и что в большинстве случаев есть лучшие способы сделать что-то. Но я все еще рассматриваю способ, которым двигатель связывает все вещи, чтобы быть недостатком дизайна; нет причины, по которой язык не может иметьsleep()
функцию, ограниченную конкретным сценарием, страницей или функцией, без того, что движок забивает процессор и замораживает приложение, как маньяк. Это 2015 год, и вы не сможете разбить весь веб-браузер сwhile(1)
. У нас есть Flash для таких вещей.В JavaScript я переписываю каждую функцию, чтобы она могла завершиться как можно скорее. Вы хотите, чтобы браузер вернулся к управлению, чтобы он мог вносить изменения в DOM.
Каждый раз, когда мне хотелось поспать в середине моей функции, я использовал рефакторинг
setTimeout()
.редактировать
Печально известный сон или задержка функционирования на любом языке широко обсуждается. Некоторые скажут, что всегда должен быть сигнал или обратный вызов для запуска определенной функциональности, другие утверждают, что иногда полезен произвольный момент задержки. Я говорю, что каждому свое и одно правило никогда ничего не может диктовать в этой отрасли.
Написание функции сна просто и стало еще удобнее с обещаниями JavaScript:
источник
function foobar(el) { setTimeout(function() { foobar_cont(el); }, 5000); }
Только для отладки / разработки , я выкладываю это, если это кому-то полезно
Интересные вещи, в Firebug (и, вероятно, других консолях js), ничего не происходит после нажатия enter, только после указанной продолжительности сна (...)
Пример использования:
источник
only for debug/dev
... rolleyesЯ согласен с другими постерами, плохой сон - это просто плохая идея.
Однако setTimeout не задерживает выполнение, он выполняет следующую строку функции сразу после истечения времени ожидания SET, а не после истечения времени ожидания, так что не выполняется та же задача, что и спящий.
Способ сделать это состоит в том, чтобы разбить вашу функцию на части до и после.
Убедитесь, что имена ваших функций по-прежнему точно описывают, что делает каждый кусок (IE GatherInputThenWait и CheckInput, а не funcPart1 и funcPart2)
редактировать
Этот метод позволяет не выполнять выбранные вами строки кода до ПОСЛЕ вашего тайм-аута, в то же время возвращая управление клиентскому ПК, чтобы выполнить все, что еще было поставлено в очередь.
Далее Править
Как указано в комментариях, это абсолютно НЕ будет работать в цикле. Вы могли бы сделать какой-нибудь причудливый (уродливый) взлом, чтобы заставить его работать в цикле, но в целом это просто приведет к катастрофическому спагетти-коду.
источник
function foo(index) { setTimeout(function() { foo_continue(index); }, 10000); }
andfor(var X = 0; X < 3;X++) { foo(X); }
- передается значение Xfoo
, которое затем повторно используется под именем,index
когдаfoo_continue
в конце концов вызывается.console.log()
внутреннюю частьfoo_continue()
в версию setTimeout, и вы получите тот же результат.Ради любви к $ DEITY, пожалуйста, не делайте функцию сна с занятым ожиданием.
setTimeout
иsetInterval
делай все что нужно.Каждые две секунды интервал скрывает текст на одну секунду. Здесь показано, как использовать setInterval и setTimeout для отображения и скрытия текста каждую секунду.
источник
Я знаю, что это немного старый вопрос, но если (как и я) вы используете Javascript с Rhino, вы можете использовать ...
источник
Если вы используете jQuery, кто-то на самом деле создал плагин «delay», который является не более чем оболочкой для setTimeout:
Затем вы можете просто использовать его в строке вызовов функций, как и ожидалось:
источник
.delay()
является частью jQuery (хотя семантика отличается от приведенной выше реализации). api.jquery.com/delayЯ также искал решение для сна (не для производственного кода, только для dev / tests) и нашел эту статью:
http://narayanraman.blogspot.com/2005/12/javascript-sleep-or-wait.html
... и вот еще одна ссылка с решениями на стороне клиента: http://www.devcheater.com/
Кроме того, когда вы звоните
alert()
, ваш код будет также приостановлен, пока отображается предупреждение - нужно найти способ не отображать предупреждение, но получить тот же эффект. :)источник
Вот простое решение с использованием синхронного XMLHttpRequest:
содержимое sleep.php:
Теперь назовите это с помощью: sleep (5);
источник
setTimeout()
если это работает, но если это означает, что нужно распутать 1000 строк обратных вызовов, это может начать выглядеть не шуткой.sleep(300)
веб-сайт и ответ занимает 150 мс, тогда код javascript будет находиться в спящем режиме в течение 450 мс. и если интернет-соединение теряется браузером, оно будет работать только 0 мс. Так что это не лучшее решениеНу вот. Как говорится в коде, не будьте плохим разработчиком и используйте это на веб-сайтах. Это функция полезности разработки.
источник
async/await
оно, к сожалению, не отвечает, и мы вынуждены использовать его обязательно.Мне лично нравится простое
тогда:
Я использую его все время для создания фальшивого времени загрузки при создании скриптов в P5js
источник
Первый:
Определите функцию, которую вы хотите выполнить следующим образом:
Затем запланируйте его выполнение с помощью метода setTimeout:
Обратите внимание на две вещи
источник
убедитесь, что ваша вызывающая функция асинхронная
проверено и работает нормально
источник
Лучшее решение для того, чтобы все выглядело так, как того хочет большинство людей, - это использование анонимной функции:
Это, вероятно, ближе всего к тому, что просто делает то, что вы хотите.
Обратите внимание: если вам нужно несколько снов, это может привести к неприятным последствиям, и вам, возможно, придется пересмотреть свой дизайн.
источник
Для браузеров, я согласен, что setTimeout и setInterval - путь.
Но для серверного кода может потребоваться функция блокировки (например, чтобы вы могли эффективно синхронизировать потоки).
Если вы используете node.js и meteor, возможно, вы столкнулись с ограничениями использования setTimeout в волокне. Вот код для сна на стороне сервера.
Смотрите: https://github.com/laverdet/node-fibers#sleep
источник
Server may require a blocking function
... Я не понимаю, как принудительно блокировать единственный поток в Node и заставить весь сервер не отвечать на запросы в течение нескольких секунд - хорошая идея, но что угодноЯ бы инкапсулировал setTimeOut в Promise для согласованности кода с другими асинхронными задачами: Демонстрация в Fiddle
Используется так:
Синтаксис легко запомнить, если вы использовали Обещания.
источник
Обновление 2019 с использованием Atomics.wait
Должен работать в узле 9.3 или выше.
Мне нужен был довольно точный таймер в Node.js, и он прекрасно работает для этого. Однако кажется, что поддержка браузеров крайне ограничена.
Пробежал несколько 10 секундных таймеров.
С setTimeout я получаю ошибку до 7000 микросекунд. (7мс)
С Atomics моя ошибка кажется меньше 600 микросекунд. (0.6ms)
Обновление 2020: вкратце
из которых страница на стороне сервера, например
sleep.jsp
, выглядитисточник
Большинство ответов здесь ошибочны или, по крайней мере, устарели. Нет причин, по которым javascript должен быть однопоточным, и на самом деле это не так. Сегодня все основные браузеры поддерживают работников, до этого другие среды исполнения javascript, такие как Rhino и Node.js, поддерживали многопоточность.
«Javascript является однопоточным» не является правильным ответом. Например, выполнение функции сна на рабочем месте не будет блокировать любой код, выполняемый в потоке пользовательского интерфейса.
В более новых средах выполнения, поддерживающих генераторы и yield, можно использовать аналогичные функции для функции сна в однопоточной среде:
Эта имитация сна отличается от истинной функции сна, поскольку она не блокирует поток. Это просто сахар поверх текущей функции javascript setTimeout. Этот тип функциональности был реализован в Task.js и должен работать сегодня в Firefox.
источник
sleep
с использованием нескольких работников. При использовании Node.js функции генератора уже реализованы и могут использоваться как описано. Основные браузеры не все реализованные генераторы на сегодняшний день.Я искал / гуглил довольно много веб-страниц на javascript sleep / wait ... и НЕТ ответа, если вы хотите, чтобы javascript был "RUN, DELAY, RUN" ... то, что большинство людей получило, было либо "RUN, RUN (бесполезно) прочее), «БЕГ» или «БЕГ, БЕГ + отложенный БЕГ» ....
Поэтому я съел несколько гамбургеров и подумал: вот решение, которое работает ... но вы должны нарезать свои текущие коды ... ::: да, я знаю, это просто легче читать рефакторинг .. . по-прежнему...
// ......................................... // пример1:
// .................................... // пример2:
// ................. пример3:
// .............. example4:
источник
источник
Самое короткое решение без каких-либо зависимостей:
источник
await new Promise(function(resolve) { setTimeout(resolve, 5000); });
Вы не можете так спать в JavaScript, или, скорее, не должны. Запуск цикла sleep или while приведет к зависанию браузера пользователя до завершения цикла.
Используйте таймер, как указано в ссылке, на которую вы ссылались.
источник
Один из сценариев, в котором вам может потребоваться функция sleep () вместо использования setTimeout (), - это если у вас есть функция, реагирующая на щелчок пользователя, который в конечном итоге приведет к открытию нового, т.е. всплывающего окна, и вы инициировали некоторую обработку, которая требует короткого периода завершить до отображения всплывающего окна. Перемещение открытого окна в закрытие означает, что оно обычно блокируется браузером.
источник
Я могу понять назначение функции сна, если вам приходится иметь дело с синхронным выполнением. Функции setInterval и setTimeout создают поток параллельного выполнения, который возвращает последовательность выполнения обратно в основную программу, что неэффективно, если вам приходится ждать заданного результата. Конечно, можно использовать события и обработчики, но в некоторых случаях это не то, что предназначено.
источник
Добавляю мои два бита. Я нуждался в занятом ожидании для целей тестирования. Я не хотел разбивать код, так как это было бы много работы, поэтому простой for сделал это для меня.
Я не вижу никаких недостатков в этом, и это помогло мне.
источник
for
циклов почти всегда выполняется немедленно, независимо от максимального значения дляi
, и даже со сложным математическим кодом, размещенным внутри. Так что, если вы не ждете всего несколько миллисекунд, кажется, что в JS все равно не будет возможности изящно поспать.Это можно сделать с помощью метода сна Java. Я протестировал его в FF и IE, и он не блокирует компьютер, не проверяет ресурсы и не вызывает бесконечные попадания на сервер. Похоже, чистое решение для меня.
Сначала вы должны загрузить Java на страницу и сделать ее методы доступными. Для этого я сделал это:
Затем все, что вам нужно сделать, когда вы хотите безболезненную паузу в вашем JS, это:
Где ххх - время в миллисекундах. В моем случае (для обоснования) это было частью выполнения внутреннего заказа в очень маленькой компании, и мне нужно было распечатать счет, который должен был быть загружен с сервера. Я сделал это, загрузив счет (как веб-страницу) в iFrame, а затем распечатал iFrame. Конечно, мне пришлось ждать полной загрузки страницы, прежде чем я смог напечатать, поэтому JS пришлось сделать паузу. Я достиг этого, заставив страницу счета (в iFrame) изменить скрытое поле формы на родительской странице с помощью события onLoad. И код на родительской странице для печати счета-фактуры выглядел следующим образом (несущественные части вырезаны для ясности):
Таким образом, пользователь нажимает кнопку, скрипт загружает страницу счета-фактуры, затем ждет, проверяя каждую четверть секунды, чтобы увидеть, завершена ли загрузка страницы счета-фактуры, а затем выскакивает диалоговое окно печати, чтобы пользователь мог отправить ее на принтер. QED.
источник
Многие ответы не (прямо) отвечают на вопрос, и не этот ...
Вот мои два цента (или функции):
Если вам нужно меньше неуклюжих функций, чем
setTimeout
andsetInterval
, вы можете заключить их в функции, которые просто меняют порядок аргументов и дают им хорошие имена:Версии CoffeeScript:
Затем вы можете красиво использовать их с анонимными функциями:
Теперь он легко читается как "после N миллисекунд, ..." (или "каждые N миллисекунд, ...")
источник
Для конкретного случая, когда требуется разметить набор вызовов, выполняемых циклом, вы можете использовать что-то вроде приведенного ниже кода с прототипом. Без прототипа вы можете заменить функцию задержки на setTimeout.
источник
Если вы находитесь на node.js, вы можете взглянуть на волокна - собственное расширение C для узла, своего рода многопоточное моделирование.
Это позволяет вам сделать реальный
sleep
способ, который блокирует выполнение в волокне, но не блокирует основной поток и другие волокна.Вот пример, только что из собственного readme:
- и результаты:
источник