Pause: примеры (JAVASCRIPT)
pause: undefinedФункция pause в JavaScript
В JavaScript отсутствует встроенная функция pause или sleep, которая синхронно приостанавливает выполнение потока. Однако подобную функциональность можно эмулировать, используя асинхронные операции. Основная цель — создать задержку перед выполнением последующего кода, не блокируя главный поток браузера.
Реализация обычно основывается на объекте Promise и функции setTimeout. Функция возвращает промис, который разрешается через указанное количество миллисекунд.
Аргументы:
- ms (обязательный): число, определяющее длительность задержки в миллисекундах. Должно быть неотрицательным целым числом.
Возвращаемое значение:
- Объект Promise, который переходит в состояние «выполнено» (fulfilled) после истечения указанного времени ms. Промис не возвращает значимого значения (результатом будет undefined).
Использование: Функция применяется внутри асинхронных функций или методов с ключевым словом await для создания пауз в последовательности операций, например, в анимациях, тестировании, ограничении частоты запросов или симуляции асинхронных процессов.
Примеры использования функции pause
Базовая реализация функции:
function pause(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}Пример задержки перед выполнением действия:
async function example() {
console.log('Начало');
await pause(2000); // Пауза 2 секунды
console.log('Прошло 2 секунды');
}
example();// Результат (с задержкой):
// Начало
// (пауза 2 секунды)
// Прошло 2 секундыИспользование в цепочке промисов:
function pause(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
pause(1000)
.then(() => console.log('1 секунда прошла'))
.then(() => pause(500))
.then(() => console.log('Еще 0.5 секунды'));// Результат (с задержками):
// 1 секунда прошла
// (пауза 0.5 секунды)
// Еще 0.5 секундыПохожие механизмы в JavaScript
- setTimeout: Основная функция для отложенного выполнения кода. Не возвращает промис, что усложняет интеграцию в современный асинхронный код. Позволяет отменить таймер с помощью clearTimeout.
- setInterval: Выполняет функцию повторно с заданным интервалом. Используется для периодических действий, а не единичной паузы.
- requestAnimationFrame: Синхронизирует выполнение функции с частотой обновления кадров браузера. Применяется для плавной анимации, а не для создания произвольных задержек.
- Паттерн «Throttling/Debouncing»: Библиотеки (например, Lodash) предоставляют функции для ограничения частоты вызовов, что является более специализированным случаем управления временем выполнения.
Когда что использовать: pause (на основе промиса) удобна в асинхронных функциях для линейной записи кода с задержками. setTimeout подходит для простых отложенных действий без использования async/await. requestAnimationFrame оптимален для анимации.
Альтернативы в других языках
Python: Модуль time предоставляет синхронную функцию sleep, которая блокирует текущий поток.
import time
print("Начало")
time.sleep(2) # Блокировка на 2 секунды
print("Прошло 2 секунды")# Результат аналогичен, но поток блокируется.PHP: Функция sleep (секунды) и usleep (микросекунды) также блокируют выполнение скрипта.
echo "Начало\n";
sleep(2); // Задержка 2 секунды
usleep(500000); // Задержка 0.5 секунды
echo "Прошло время\n";C (стандартная библиотека): Функция sleep (из unistd.h) приостанавливает выполнение процесса на указанное количество секунд.
#include <unistd.h>
#include <stdio.h>
int main() {
printf("Start\n");
sleep(2); // Задержка 2 секунды
printf("End\n");
return 0;
}MySQL: Функция SLEEP(seconds) приостанавливает выполнение запроса на заданное количество секунд.
SELECT SLEEP(2); -- Запрос выполнится примерно за 2 секундыОсновное отличие: В JavaScript браузерного окружения блокировка главного потока недопустима, поэтому используются асинхронные подходы с промисами. В серверных языках (Python, PHP, C) часто используются синхронные блокирующие вызовы, что проще, но может влиять на производительность.
Типичные ошибки
1. Попытка использовать pause как синхронную функцию без await или then.
function pause(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
console.log('До паузы');
pause(1000); // Ошибка: пауза не будет ожидаться
console.log('После паузы'); // Выполнится сразу// Результат:
// До паузы
// После паузы
// (пауза не сработала как ожидалось)2. Использование отрицательного или нечислового значения времени.
async function test() {
await pause(-1000); // Таймер сработает немедленно
await pause('две секунды'); // Преобразуется в NaN, задержка 0мс
}
// Ошибки не возникнет, но поведение будет неочевидным.3. Создание большого количества микротасков через цикл без осторожности.
async function rapidPauses() {
for (let i = 0; i < 10000; i++) {
await pause(0); // Каждая итерация создает таймер
}
// Это может привести к нагрузке на планировщик.
}История изменений
Концепция функции pause не является частью стандарта ECMAScript, поэтому изменения касаются лишь способов ее реализации в контексте развития языка.
- До появления Promise (ES6/ES2015) задержки реализовывали через callback-функции в setTimeout, что приводило к «аду callback-ов».
- С введением async/await (ES8/ES2017) использование промис-ориентированной pause стало значительно удобнее, позволив писать линейный код с паузами.
- Современные предложения для JavaScript (например, Temporal API) не вводят синхронную функцию сна, так как это противоречит асинхронной модели браузера.
Расширенные примеры
Последовательные паузы в цикле:
async function countdown() {
for (let i = 5; i > 0; i--) {
console.log(i);
await pause(1000);
}
console.log('Старт!');
}
countdown();// Результат (с интервалом 1 секунда):
// 5
// 4
// 3
// 2
// 1
// Старт!Использование в асинхронной обработке массива с задержками:
async function processItems(items) {
for (const item of items) {
console.log(`Обработка: ${item}`);
await pause(300); // Задержка между обработкой элементов
// Имитация асинхронной операции
console.log(`Готово: ${item}`);
}
}
processItems(['A', 'B', 'C']);// Результат (с паузами 0.3 секунды):
// Обработка: A
// Готово: A
// Обработка: B
// Готово: B
// Обработка: C
// Готово: CКомбинирование с Promise.race для таймаута:
async function withTimeout(promise, ms) {
const timeoutPause = pause(ms).then(() => {
throw new Error('Таймаут операции');
});
return Promise.race([promise, timeoutPause]);
}
// Пример использования
async function longOperation() {
await pause(5000); // Имитация долгой операции
return 'Результат';
}
try {
const result = await withTimeout(longOperation(), 2000);
console.log(result);
} catch (e) {
console.error(e.message); // Таймаут операции
}Пауза в методах класса:
class Robot {
async walk(steps) {
for (let i = 0; i < steps; i++) {
console.log(`Шаг ${i + 1}`);
await pause(500);
}
}
}
const robot = new Robot();
robot.walk(3);// Результат (с интервалом 0.5 секунды):
// Шаг 1
// Шаг 2
// Шаг 3