Αυτές είναι τρεις γενιές χειρισμού ασυγχρόνων λειτουργιών στο Node — καθεμία βελτιώνει την αναγνωσιμότητα έναντι της προηγούμενης, αλλά όλες χτίζονται στο ίδιο event-loop θεμέλιο.
1. Callbacks — η αρχική (και "callback hell")
fs.readFile("a.txt", (err, a) => {
if (err) return handle(err); // error-first callback convention
fs.readFile("b.txt", (err, b) => { // nesting deepens with each step...
if (err) return handle(err);
db.save(a + b, (err) => { // "pyramid of doom"
if (err) return handle(err);
});
});
});
Η σύμβαση του Node είναι error-first callbacks ((err, result)). Λειτουργούν αλλά φωλιάζουν σε βάθος και σκορπίζουν τη διαχείριση σφαλμάτων — δύσκολο να διαβαστούν και να συντηρηθούν.
2. Promises — αλυσιδωτά, επιπεδότερα
readFile("a.txt")
.then(a => readFile("b.txt").then(b => a + b)) // return a promise → chain waits
.then(combined => db.save(combined))
.catch(handle); // ONE place for all errors
Ένα Promise αντιπροσωπεύει μια μελλοντική τιμή· το .then αλυσιδώνει βήματα και το .catch χειρίζεται οποιοδήποτε σφάλμα στην αλυσίδα — επιπεδότερα από φωλιασμένα callbacks.
3. async/await — φαίνεται σύγχρονο (το σύγχρονο προεπιλογή)
async function combine() {
try {
const a = await readFile("a.txt"); // pause until resolved
const b = await readFile("b.txt");
await db.save(a + b);
} catch (err) {
handle(err); // normal try/catch works
}
}
Το async/await είναι συντακτικό ζάχαρι πάνω από Promises — διαβάζεται από πάνω προς τα κάτω όπως σύγχρονος κώδικας, χρησιμοποιεί συνηθισμένο try/catch, και είναι το συνιστώμενο σύγχρονο στυλ.
Μη σειριοποιείτε ανεξάρτητη εργασία
// ❌ sequential — slow
const a = await getA(); const b = await getB();
// ✅ parallel — both at once
const [a, b] = await Promise.all([getA(), getB()]);
Η σχέση
Callbacks → Promises → async/await
All use the event loop. Promises wrap callbacks; async/await wraps Promises.
Modern code: async/await, with Promise.all to parallelize independent ops.
Γιατί έχει σημασία
Ο χειρισμός Async είναι αναπόφευκτος στο Node (όλα τα I/O είναι ασύγχρονα).
Η κατανόηση της εξέλιξης — error-first callbacks (ακόμα συνηθισμένα σε παλιότερα APIs/βιβλιοθήκες), Promises (αλυσιδωτά) και async/await (αναγνώσιμα, η προεπιλογή) — σας επιτρέπει να διαβάσετε οποιονδήποτε codebase και να γράψετε καθαρή ασύγχρονη λογική.
Η γνώση ότι είναι όλα ο ίδιος μηχανισμός event-loop από κάτω, και η αναμνήση παραλληλοποίησης ανεξάρτητων λειτουργιών με Promise.all, είναι κλειδί σε σωστό και αποδοτικό ασύγχρονο κώδικα Node.
