HARDEST PROMISES

PHOTO EMBED

Sun Aug 17 2025 15:00:07 GMT+0000 (Coordinated Universal Time)

Saved by @E23CSEU1151

// 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));
content_copyCOPY