Коротка відповідь
middleФункція Sleep — це асинхронна обгортка Promise, що резолвиться після setTimeout. Наприклад: `async function sleep(ms){ return new Promise(r=>setTimeout(r,ms)); }`. Виклик `await sleep(1000)` зупиняє виконання на 1 секунду.
Повне пояснення
Що це і навіщо
Sleep — утиліта для затримки виконання в async‑функціях, корисна при тестуванні, дебаунсі або синхронізації.
Принцип роботи / алгоритм
Функція повертає Promise, який резолвиться через setTimeout. Коли Promise завершено, await продовжує виконання.
Реалізація (JS / TS)
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
Тестування
import { test, expect } from 'vitest';
test('sleep delays', async () => {
const start = Date.now();
await sleep(200);
expect(Date.now() - start).toBeGreaterThanOrEqual(200);
});
Проблеми та edge cases
- Zero or negative ms – Promise resolves immediately; no error.
- Large ms –
setTimeoutmax 2147483647 ms; overflow leads to wrap. - Cancellation – native Promise cannot be cancelled; use AbortController if needed.
- CPU blocking –
sleepdoes not block event loop; only schedules callback. - Nested sleeps – stacking
await sleepcan cause drift; use a single timer if precision matters.
Оптимізація та продуктивність
setTimeout є оптимальним для коротких затримок; не створює зайвих об’єктів. Якщо потрібна точність мікросекунд, використовуйте performance.now() у циклі.
Без JS / архітектурні альтернативи
У чистому HTML/CSS можна симулювати затримку через animation-delay або transition-delay, але це не замінить асинхронну логіку.
Cheatsheet + follow-up
sleep(0)→ microtask queue, не блокує.- Для таймауту з обробкою помилки використовуйте
Promise.race.
Потенційне інтерв’ю‑питання: Як реалізувати скасування sleep за допомогою AbortController?