Γρήγορη αναφορά

JavaScript Promises Σημειώσεις

Ένας οδηγός αναφοράς για τα JavaScript Promises: κατασκευαστής, αλυσίδες, διαχείριση σφαλμάτων, συνδυαστές (all, allSettled, race, any) και async/await.

· Δημοσιεύτηκε

Ένα Promise αντιπροσωπεύει την τελική ολοκλήρωση (ή αποτυχία) μιας ασύγχρονης λειτουργίας και την τιμή που προκύπτει από αυτήν.

Καταστάσεις ενός Promise

Ένα Promise βρίσκεται πάντα σε μία από τρεις καταστάσεις:

  1. pending: Αρχική κατάσταση, ούτε ολοκληρωμένη ούτε απορριφθείσα.
  2. fulfilled: Η λειτουργία ολοκληρώθηκε επιτυχώς (resolve(value)).
  3. rejected: Η λειτουργία απέτυχε (reject(error)).

Κατασκευαστής και Βασική Αλυσίδα

const loadUser = (id) => {
  return new Promise((resolve, reject) => {
    fetch(`/api/users/${id}`)
      .then((res) => {
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        return res.json();
      })
      .then((data) => resolve(data))
      .catch((err) => reject(err));
  });
};

loadUser(42)
  .then((user) => console.log('Φορτώθηκε επιτυχώς:', user.name))
  .catch((err) => console.error('Error:', err.message))
  .finally(() => console.log('Το αίτημα ολοκληρώθηκε'));

Στατικές Μέθοδοι Επίλυσης

// Άμεσα εκπληρωμένο promise
const p1 = Promise.resolve('Immediate value');

// Άμεσα απορριφθέν promise
const p2 = Promise.reject(new Error('Immediate failure'));

Συνδυαστές Promises (Combinators)

Μέθοδος Συμπεριφορά Συνθήκη Αποτυχίας
Promise.all([p1, p2]) Αναμονή για επιτυχή ολοκλήρωση όλων Οποιοδήποτε promise απορριφθεί (άμεση διακοπή)
Promise.allSettled([p1, p2]) Αναμονή μέχρι να ολοκληρωθούν όλα ανεξαρτήτως αποτελέσματος Δεν απορρίπτεται ποτέ
Promise.race([p1, p2]) Επιστρέφει το αποτέλεσμα του πρώτου ολοκληρωμένου promise Το πρώτο ολοκληρωμένο promise απορριφθεί
Promise.any([p1, p2]) Εκπληρώνεται με το πρώτο επιτυχές promise Όλα τα promises απορριφθούν (AggregateError)
// Promise.all: Παράλληλη αναμονή πολλαπλών αιτημάτων
const [users, posts] = await Promise.all([
  fetchUsers(),
  fetchPosts()
]);

// Promise.allSettled: Έλεγχος κατάστασης όλων των αιτημάτων
const results = await Promise.allSettled([reqA(), reqB()]);
results.forEach((res) => {
  if (res.status === 'fulfilled') console.log('Value:', res.value);
  else console.error('Reason:', res.reason);
});

Ισοδύναμο Μοτίβο με Async / Await

async function getUserData(id) {
  try {
    const res = await fetch(`/api/users/${id}`);
    const data = await res.json();
    return data;
  } catch (err) {
    console.error('Failed to retrieve user:', err);
    throw err;
  }
}

Σχετικές Αναφορές

Σχετικά θέματα