Create a promise-based sleep function
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function delayed() {
console.log('Start');
await sleep(2000); // Wait 2 seconds
console.log('After 2 seconds');
}async function loadWithDelay() {
console.log('Loading...');
await sleep(1000);
console.log('Still loading...');
await sleep(1000);
console.log('Done!');
}
// With timeout for fetch
async function fetchWithTimeout(url, timeout = 5000) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeout);
try {
const response = await fetch(url, { signal: controller.signal });
clearTimeout(timeoutId);
return response;
} catch (error) {
if (error.name === 'AbortError') {
throw new Error('Request timeout');
}
throw error;
}
}async function retryWithDelay(fn, retries = 3, delay = 1000) {
for (let i = 0; i < retries; i++) {
try {
return await fn();
} catch (error) {
if (i === retries - 1) throw error;
await sleep(delay);
}
}
}let timeoutId;
const debounced = async (fn, delay) => {
clearTimeout(timeoutId);
return new Promise(resolve => {
timeoutId = setTimeout(() => resolve(fn()), delay);
});
};Avoid blocking code or busy waiting
// DON'T DO THIS
var start = Date.now();
while (Date.now() - start < 2000) {
// Blocks the entire thread
}✓ Works in all modern browsers (ES2015+)