Как сделать паузу (sleep) в JavaScript? Аналог sleep() из других языков
Правильный способ: используйте промисы и async/await
В JavaScript нет синхронного sleep(), потому что это заблокировало бы единственный поток выполнения и "подвесило" бы интерфейс. Вместо этого нужно использовать асинхронный подход. Вот как это делается:
// Универсальная функция sleep
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// Использование с async/await
async function example() {
console.log("Начало");
await sleep(3000); // Ждём 3 секунды
console.log("Прошло 3 секунды");
}
example();
Как это работает
- Promise — объект, представляющий будущий результат. Мы создаём его, который "разрешится" (resolve) через указанное время.
- setTimeout — вызывает resolve через заданное количество миллисекунд.
- async/await — позволяет писать асинхронный код как синхронный. Ключевое слово
awaitприостанавливает выполнение функции до тех пор, пока Promise не выполнится.
Полный пример для браузера
<button onclick="runDemo()">Запустить демо</button>
<div id="output"></div>
<script>
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function runDemo() {
const output = document.getElementById('output');
output.innerHTML += 'Старт!<br>';
await sleep(1000);
output.innerHTML += 'Прошла 1 секунда<br>';
await sleep(2000);
output.innerHTML += 'Прошло ещё 2 секунды (всего 3)<br>';
await sleep(500);
output.innerHTML += 'Готово!<br>';
}
</script>
Пример для Node.js
// Тот же подход работает и в Node.js
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function main() {
console.log('Запуск');
await sleep(2000);
console.log('Прошло 2 секунды');
}
main();
Важные моменты
- Не блокирует поток — во время ожидания JavaScript может обрабатывать другие события (клики, таймеры и т.д.)
- Только внутри async функций —
awaitможно использовать только внутри функций, объявленных сasync - Миллисекунды — функция принимает миллисекунды, а не секунды. Для 1 секунды пишите
sleep(1000) - Точность — не гарантируется идеальная точность, но для большинства задач её достаточно
Альтернативный подход: синхронная блокировка (только для Node.js)
Если вам критично нужна именно синхронная блокировка (например, в консольных скриптах), в Node.js есть встроенный модуль timers с функцией setTimeoutSync (экспериментальная). Но чаще используют пакет sleep из npm:
// Установка: npm install sleep
const sleep = require('sleep');
console.log('Начало');
sleep.sleep(3); // Блокирует на 3 секунды
console.log('Прошло 3 секунды');
Или можно использовать execSync для имитации:
const { execSync } = require('child_process');
execSync('sleep 3'); // Только на Linux/macOS
Почему это не рекомендуется
- Блокирует весь процесс — сервер не сможет обрабатывать другие запросы
- В браузере такие методы вызывают зависание интерфейса
- Не является стандартным решением в экосистеме JS
Поэтому для 99% случаев используйте async/await с Promise — это современный, безопасный и переносимый подход.