Skip to content

Commit 75d5bea

Browse files
authored
Merge pull request #10 from nikcladis/feature/async-programming-docs
📄 Docs(Async): Add Callbacks subsection
2 parents 0586999 + 5ac4c17 commit 75d5bea

1 file changed

Lines changed: 210 additions & 0 deletions

File tree

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
# Callbacks
2+
3+
Οι **Callbacks** είναι ο παραδοσιακός τρόπος διαχείρισης ασύγχρονων λειτουργιών στη JavaScript. Μια `callback` είναι μια συνάρτηση που περνιέται ως παράμετρος σε μια άλλη συνάρτηση και καλείται όταν ολοκληρωθεί η ασύγχρονη λειτουργία. Ας δούμε κάποια παραδείγματα:
4+
5+
```javascript
6+
function greet(name, callback) {
7+
console.log("Hello, " + name + "!");
8+
callback(); // Εκτέλεση της callback συνάρτησης
9+
}
10+
11+
function sayGoodbye() {
12+
console.log("Goodbye!");
13+
}
14+
15+
// Κλήση της greet συνάρτησης με την sayGoodBye ως callback
16+
greet("Maria", sayGoodbye);
17+
18+
// Hello, Maria!
19+
// Goodbye!
20+
21+
22+
Στο παράδειγμα αυτό, η `sayGoodBye` δίνεται ως callback στη `greet`, η οποία την καλεί μετά τον χαιρετισμό.
23+
24+
```javascript
25+
function fetchData(callback) {
26+
console.log("Λήψη δεδομένων...");
27+
28+
setTimeout(() => {
29+
console.log("Τα δεδομένα ελήφθησαν!");
30+
callback();
31+
}, 2000);
32+
}
33+
34+
function processData() {
35+
console.log("Επεξεργασία δεδομένων...");
36+
}
37+
38+
// Κλήση της συνάρτησης με callback
39+
fetchData(processData);
40+
41+
// Λήψη δεδομένων...
42+
// Τα δεδομένα ελήφθησαν!
43+
// Επεξεργασία δεδομένων...
44+
45+
```
46+
47+
:::info `setTimeout`
48+
Η `setTimeout` είναι μια ενσωματωμένη συνάρτηση της JavaScript που καθυστερεί την εκτέλεση κώδικα για συγκεκριμένο χρονικό διάστημα. Στο παραπάνω παράδειγμα, η `setTimeout` προσομοιώνει μια ασύγχρονη λειτουργία (π.χ. αίτημα δικτύου) που διαρκεί 2000 milliseconds (2 δευτερόλεπτα). Είναι ένα από τα πιο απλά παραδείγματα ασύγχρονου κώδικα στη JavaScript.
49+
:::
50+
51+
Σε αυτό το παράδειγμα η επεξεργασία δεδομένων (μέσω της `processData`) εκτελείται μόνο αφού ολοκληρωθεί η λήψη δεδομένων (μέσω της `fetchData`), αξιοποιώντας έτσι την ασύγχρονη συμπεριφορά.
52+
53+
## Χειρισμός Σφαλμάτων
54+
55+
Στις callbacks χρησιμοποιούμε το μοτίβο **error-first** όπου το πρώτο όρισμα της `callback` είναι το σφάλμα (error) και το δεύτερο τα δεδομένα (data).
56+
57+
```javascript
58+
const getUser = (id, callback) => {
59+
if (id <= 0) {
60+
callback(new Error('Μη έγκυρο ID'));
61+
return;
62+
}
63+
callback(null, { id, name: 'Χρήστης ' + id });
64+
};
65+
66+
// Παράδειγμα επιτυχίας
67+
getUser(123, (error, user) => {
68+
if (error) {
69+
console.error(error.message);
70+
return;
71+
}
72+
console.log(user.name); // ✅ "Χρήστης 123"
73+
});
74+
75+
// Παράδειγμα σφάλματος
76+
getUser(-123, (error, user) => {
77+
if (error) {
78+
console.error(error.message); // ❌ "Μη έγκυρο ID"
79+
return;
80+
}
81+
console.log(user.name);
82+
});
83+
```
84+
85+
## Συνηθισμένες Χρήσεις
86+
87+
Οι callbacks χρησιμοποιούνται συχνά σε:
88+
89+
```javascript
90+
// Node.js - Ανάγνωση αρχείου
91+
fs.readFile('config.json', 'utf8', (error, data) => {
92+
if (error) return console.error('Σφάλμα:', error);
93+
console.log('Περιεχόμενο:', data);
94+
});
95+
96+
// Browser - Χειρισμός συμβάντων
97+
document.getElementById('button').addEventListener('click', () => {
98+
console.log('Το κουμπί πατήθηκε!');
99+
});
100+
```
101+
102+
## Callback hell
103+
104+
Ωστόσο, οι callbacks μπορούν να οδηγήσουν σε **callback hell****pyramid of doom**) όταν έχουμε πολλές ένθετες ασύγχρονες λειτουργίες:
105+
106+
```javascript
107+
fetchUserData((error, userData) => {
108+
if (error) {
109+
console.error('Σφάλμα κατά την ανάκτηση δεδομένων χρήστη:', error);
110+
return;
111+
}
112+
getUserPosts(userData.id, (error, posts) => {
113+
if (error) {
114+
console.error('Σφάλμα κατά την ανάκτηση αναρτήσεων:', error);
115+
return;
116+
}
117+
getPostComments(posts[0].id, (error, comments) => {
118+
if (error) {
119+
console.error('Σφάλμα κατά την ανάκτηση σχολίων:', error);
120+
return;
121+
}
122+
// Αυτή η ένθετη δομή μπορεί να γίνει δύσκολα διαχειρίσιμη
123+
});
124+
});
125+
});
126+
```
127+
128+
Αυτό το φαινόμενο κάνει τον κώδικα:
129+
130+
- Δύσκολο στην ανάγνωση
131+
- Δύσκολο στη συντήρηση
132+
- Επιρρεπή σε λάθη
133+
134+
## Βελτίωση της Αναγνωσιμότητας των Callbacks
135+
136+
Υπάρχουν καλές πρακτικές που μπορούμε να ακολουθήσουμε για να βελτιώσουμε την αναγνωσιμότητα του κώδικα με callbacks. Μία από αυτές είναι να χρησιμοποιούμε **Ονομασμένες Συναρτήσεις** (Named Functions).
137+
138+
### Ονομασμένες Συναρτήσεις
139+
140+
```javascript
141+
const handleUserData = (error, userData) => {
142+
if (error) {
143+
console.error('Σφάλμα κατά την ανάκτηση δεδομένων χρήστη:', error);
144+
return;
145+
}
146+
getUserPosts(userData.id, handlePosts);
147+
};
148+
149+
const handlePosts = (error, posts) => {
150+
if (error) {
151+
console.error('Σφάλμα κατά την ανάκτηση αναρτήσεων:', error);
152+
return;
153+
}
154+
getPostComments(posts[0].id, handleComments);
155+
};
156+
157+
const handleComments = (error, comments) => {
158+
if (error) {
159+
console.error('Σφάλμα κατά την ανάκτηση σχολίων:', error);
160+
return;
161+
}
162+
console.log('Σχόλια:', comments);
163+
};
164+
165+
fetchUserData(handleUserData);
166+
```
167+
168+
Η διαφορά μεταξύ των δύο προσεγγίσεων μπορεί να απεικονιστεί ως εξής:
169+
170+
**Callback Hell (Πυραμίδα 🔺)**
171+
172+
```
173+
fetchUserData(
174+
└── getUserPosts(
175+
└── getPostComments(
176+
└── handleResult()
177+
)
178+
)
179+
)
180+
```
181+
182+
**Ονομασμένες Συναρτήσεις (Αλυσίδα 🔗)**
183+
184+
```
185+
fetchUserData → handleUserData
186+
187+
188+
getUserPosts → handlePosts
189+
190+
191+
getPostComments → handleComments
192+
```
193+
194+
Η προσέγγιση με ονομασμένες συναρτήσεις δημιουργεί μια οριζόντια ροή αντί για μια βαθιά ένθετη δομή, κάνοντας τον κώδικα πιο ευανάγνωστο και ευκολότερο στη συντήρηση.
195+
196+
## Σύγκριση με Σύγχρονες Προσεγγίσεις
197+
198+
Για να αντιμετωπίσουμε τα προβλήματα των callbacks, η JavaScript έχει εισαγάγει πιο σύγχρονους τρόπους διαχείρισης ασύγχρονων λειτουργιών:
199+
200+
| Προσέγγιση | Πλεονεκτήματα | Μειονεκτήματα |
201+
| ------------- | ----------------------------------------------------- | ------------------------------------------- |
202+
| `Callbacks` | Απλή υλοποίηση, ευρεία υποστήριξη | Callback hell, δύσκολος χειρισμός σφαλμάτων |
203+
| `Promises` | Αλυσιδωτές λειτουργίες, καλύτερος χειρισμός σφαλμάτων | Πιο περίπλοκη σύνταξη από τα callbacks |
204+
| `Async/Await` | Συγχρονική σύνταξη, εύκολη ανάγνωση | Απαιτεί κατανόηση των Promises |
205+
206+
:::tip Συμβουλή
207+
Παρόλο που οι callbacks θεωρούνται παλαιότερη τεχνολογία, είναι σημαντικό να τις κατανοήσουμε καθώς πολλές βιβλιοθήκες και APIs εξακολουθούν να τις χρησιμοποιούν.
208+
:::
209+
210+
Στην επόμενη ενότητα, θα εξετάσουμε τα `Promises`, που προσφέρουν έναν πιο κομψό τρόπο διαχείρισης ασύγχρονων λειτουργιών.

0 commit comments

Comments
 (0)