Sobes.tech
Middle

Πώς εργάζεστε με ασύγχρονο JavaScript;

sobes.tech AI

Απάντηση από AI

Εργάζομαι με ασυγχρονία στην JavaScript χρησιμοποιώντας callbacks, promises και async/await.

Τα callbacks είναι συναρτήσεις που περνιούνται σε άλλες συναρτήσεις ως ορίσματα και εκτελούνται μετά την ολοκλήρωση μιας λειτουργίας. Μπορούν να οδηγήσουν σε "κόλαση των callbacks" όταν είναι εμφωλευμένα.

// Παράδειγμα callback
function fetchData(callback) {
  setTimeout(() => {
    callback("Δεδομένα λήφθηκαν");
  }, 1000);
}

fetchData((data) => {
  console.log(data); // Θα εμφανίσει "Δεδομένα λήφθηκαν" μετά από 1 δευτερόλεπτο
});

Οι promises είναι αντικείμενα που αντιπροσωπεύουν την τελική ολοκλήρωση ή αποτυχία μιας ασύγχρονης λειτουργίας. Διευκολύνουν τη δουλειά με ασύγχρονο κώδικα, αποφεύγοντας βαθιά εμφωλευμένα. Έχουν τρεις καταστάσεις: pending (σε αναμονή), fulfilled (ολοκληρώθηκε), rejected (απορρίφθηκε).

// Παράδειγμα promise
function fetchDataPromise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("Δεδομένα λήφθηκαν");
    }, 1000);
  });
}

fetchDataPromise()
  .then((data) => {
    console.log(data); // Θα εμφανίσει "Δεδομένα λήφθηκαν" μετά από 1 δευτερόλεπτο
  })
  .catch((error) => {
    console.error("Σφάλμα:", error);
  });

Το async/await είναι ζάχαρη σύνταξης πάνω από promises που καθιστά τον ασύγχρονο κώδικα πιο ευανάγνωστο, παρόμοιο με τον συγχρονικό. Μια συνάρτηση που σημειώνεται με async επιστρέφει πάντα promise. Ο τελεστής await μπορεί να χρησιμοποιηθεί μόνο μέσα σε async συναρτήσεις και αναστέλλει την εκτέλεση μέχρι το promise να ολοκληρωθεί ή να απορριφθεί.

// Παράδειγμα async/await
async function fetchDataAsync() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("Δεδομένα λήφθηκαν");
    }, 1000);
  });
}

async function processData() {
  try {
    const data = await fetchDataAsync();
    console.log(data); // Θα εμφανίσει "Δεδομένα λήφθηκαν" μετά από 1 δευτερόλεπτο
  } catch (error) {
    console.error("Σφάλμα:", error);
  }
}

processData();

Συχνά χρησιμοποιώ async/await όταν δουλεύω με API αιτήματα, καθώς είναι ο πιο βολικός και ευανάγνωστος τρόπος διαχείρισης ασύγχρονων λειτουργιών. Για παράλληλη εκτέλεση πολλαπλών ασύγχρονων λειτουργιών, χρησιμοποιώ Promise.all() ή Promise.allSettled().

Χρησιμοποιώ το event loop για να κατανοήσω τη σειρά εκτέλεσης του ασύγχρονου κώδικα, microtasks και macrotasks.