// Utility function for delay function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // Function to hit API with retries and delay function hitApiWithRetry(url, options = {}, retries = 3, delay = 1000, callbacks = {}) { return new Promise(async (resolve, reject) => { for (let attempt = 1; attempt <= retries; attempt++) { try { console.log(`Attempt ${attempt}...`); let response = await fetch(url, options); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } let data = await response.json(); // success callback if (callbacks.onSuccess) { callbacks.onSuccess(data, attempt); } return resolve(data); // resolve promise if success } catch (err) { console.error(`Error on attempt ${attempt}: ${err.message}`); // error callback if (callbacks.onError) { callbacks.onError(err, attempt); } if (attempt < retries) { console.log(`Retrying in ${delay}ms...`); await wait(delay); } else { return reject(`Failed after ${retries} attempts`); } } } }); } // Usage example: hitApiWithRetry( "https://jsonplaceholder.typicode.com/posts/1", {}, 3, // retries 2000, // delay (ms) { onSuccess: (data, attempt) => { console.log(`✅ Success on attempt ${attempt}`, data); }, onError: (err, attempt) => { console.log(`❌ Failed on attempt ${attempt}: ${err.message}`); } } ) .then(data => console.log("Final Data:", data)) .catch(err => console.log("Final Error:", err));
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter