Skip to content

Commit 0c7913e

Browse files
committed
Updated asynchronus category
1 parent a0254b5 commit 0c7913e

3 files changed

Lines changed: 156 additions & 130 deletions

File tree

docs-language/asynchronous/2. callbacks.md

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Callbacks
22

3-
Οι **Callbacks** είναι ο παραδοσιακός τρόπος διαχείρισης ασύγχρονων λειτουργιών στη JavaScript. Μια `callback` είναι μια συνάρτηση που περνιέται ως παράμετρος σε μια άλλη συνάρτηση και καλείται όταν ολοκληρωθεί η ασύγχρονη λειτουργία. Ας δούμε κάποια παραδείγματα:
3+
Οι **Callbacks** είναι ο παραδοσιακός τρόπος διαχείρισης ασύγχρονων λειτουργιών στη JavaScript.
4+
5+
Μια `callback` είναι μια συνάρτηση που περνιέται ως παράμετρος σε μια άλλη συνάρτηση και καλείται όταν ολοκληρωθεί η ασύγχρονη λειτουργία. Ας δούμε κάποια παραδείγματα:
46

57
```javascript
68
function greet(name, callback) {
@@ -21,6 +23,8 @@ greet('Maria', sayGoodbye);
2123

2224
Στο παράδειγμα αυτό, η `sayGoodBye` δίνεται ως callback στη `greet`, η οποία την καλεί μετά τον χαιρετισμό.
2325

26+
Ας δούμε ένα πιο ρεαλιστικό παράδειγμα με ασύγχρονη λειτουργία:
27+
2428
```javascript
2529
function fetchData(callback) {
2630
console.log('Λήψη δεδομένων...');
@@ -43,16 +47,22 @@ fetchData(processData);
4347
// Επεξεργασία δεδομένων...
4448
```
4549

46-
:::info `setTimeout`
47-
Η `setTimeout` είναι μια ενσωματωμένη συνάρτηση της JavaScript που καθυστερεί την εκτέλεση κώδικα για συγκεκριμένο χρονικό διάστημα. Στο παραπάνω παράδειγμα, η `setTimeout` προσομοιώνει μια ασύγχρονη λειτουργία (π.χ. αίτημα δικτύου) που διαρκεί 2000 milliseconds (2 δευτερόλεπτα). Είναι ένα από τα πιο απλά παραδείγματα ασύγχρονου κώδικα στη JavaScript.
48-
:::
50+
Στο παραπάνω παράδειγμα, η `fetchData` προσομοιώνει μια ασύγχρονη λειτουργία (π.χ. λήψη δεδομένων από έναν διακομιστή) χρησιμοποιώντας την `setTimeout`.
51+
52+
Μόλις ολοκληρωθεί η λήψη, καλεί την `processData` ως callback για να επεξεργαστεί τα δεδομένα.
4953

50-
Σε αυτό το παράδειγμα η επεξεργασία δεδομένων (μέσω της `processData`) εκτελείται μόνο αφού ολοκληρωθεί η λήψη δεδομένων (μέσω της `fetchData`), αξιοποιώντας έτσι την ασύγχρονη συμπεριφορά.
54+
:::info[Σημείωση]
55+
56+
Η `setTimeout` είναι μια ενσωματωμένη συνάρτηση της JavaScript που καθυστερεί την εκτέλεση κώδικα για συγκεκριμένο χρονικό διάστημα. Στο παραπάνω παράδειγμα, η `setTimeout` προσομοιώνει μια ασύγχρονη λειτουργία (π.χ. αίτημα δικτύου) που διαρκεί 2000 milliseconds (2 δευτερόλεπτα).
57+
58+
:::
5159

5260
## Χειρισμός Σφαλμάτων
5361

5462
Στις callbacks χρησιμοποιούμε το μοτίβο **error-first** όπου το πρώτο όρισμα της `callback` είναι το σφάλμα (error) και το δεύτερο τα δεδομένα (data).
5563

64+
Για παράδειγμα:
65+
5666
```javascript
5767
const getUser = (id, callback) => {
5868
if (id <= 0) {
@@ -81,6 +91,10 @@ getUser(-123, (error, user) => {
8191
});
8292
```
8393

94+
Στο παράδειγμα αυτό, η `getUser` καλεί την `callback` με ένα σφάλμα αν το `id` είναι μη έγκυρο (μικρότερο ή ίσο του μηδενός).
95+
96+
Όταν καλούμε την `getUser`, ορίζουμε και την λειτουργία της `callback` ώστε να χειριστεί τόσο το σφάλμα όσο και τα δεδομένα.
97+
8498
## Συνηθισμένες Χρήσεις
8599

86100
Οι callbacks χρησιμοποιούνται συχνά σε:
@@ -98,27 +112,31 @@ document.getElementById('button').addEventListener('click', () => {
98112
});
99113
```
100114

115+
Στο πρώτο παράδειγμα, η `readFile` χρησιμοποιεί μια callback για να χειριστεί το αποτέλεσμα της ανάγνωσης αρχείου.
116+
117+
Στο δεύτερο παράδειγμα, μια callback χρησιμοποιείται για να χειριστεί το συμβάν κλικ σε ένα κουμπί.
118+
101119
## Callback hell
102120

103-
Ωστόσο, οι callbacks μπορούν να οδηγήσουν σε **callback hell****pyramid of doom**) όταν έχουμε πολλές ένθετες ασύγχρονες λειτουργίες:
121+
Οι callbacks μπορούν συχνά να οδηγήσουν σε **callback hell****pyramid of doom**) όταν έχουμε πολλές εμφωλευμένες ασύγχρονες λειτουργίες:
104122

105123
```javascript
106124
fetchUserData((error, userData) => {
107125
if (error) {
108-
console.error('Σφάλμα κατά την ανάκτηση δεδομένων χρήστη:', error);
126+
console.error('Σφάλμα στην ανάκτηση δεδομένων χρήστη:', error);
109127
return;
110128
}
111129
getUserPosts(userData.id, (error, posts) => {
112130
if (error) {
113-
console.error('Σφάλμα κατά την ανάκτηση αναρτήσεων:', error);
131+
console.error('Σφάλμα στην ανάκτηση αναρτήσεων:', error);
114132
return;
115133
}
116134
getPostComments(posts[0].id, (error, comments) => {
117135
if (error) {
118-
console.error('Σφάλμα κατά την ανάκτηση σχολίων:', error);
136+
console.error('Σφάλμα στην ανάκτηση σχολίων:', error);
119137
return;
120138
}
121-
// Αυτή η ένθετη δομή μπορεί να γίνει δύσκολα διαχειρίσιμη
139+
// Αυτή η εμφωλευμένη δομή μπορεί να γίνει δύσκολα διαχειρίσιμη
122140
});
123141
});
124142
});
@@ -132,30 +150,30 @@ fetchUserData((error, userData) => {
132150

133151
## Βελτίωση της Αναγνωσιμότητας των Callbacks
134152

135-
Υπάρχουν καλές πρακτικές που μπορούμε να ακολουθήσουμε για να βελτιώσουμε την αναγνωσιμότητα του κώδικα με callbacks. Μία από αυτές είναι να χρησιμοποιούμε **Ονομασμένες Συναρτήσεις** (Named Functions).
153+
Υπάρχουν καλές πρακτικές που μπορούμε να ακολουθήσουμε για να βελτιώσουμε την αναγνωσιμότητα του κώδικα με callbacks.
136154

137-
### Ονομασμένες Συναρτήσεις
155+
Μία από αυτές είναι να χρησιμοποιούμε **ονομασμένες συναρτήσεις** (named functions). Στην ουσία, αντί να ορίζουμε ανώνυμες συναρτήσεις απευθείας μέσα στις κλήσεις, μπορούμε να δημιουργήσουμε ξεχωριστές ονομασμένες συναρτήσεις για κάθε βήμα της διαδικασίας.
138156

139157
```javascript
140158
const handleUserData = (error, userData) => {
141159
if (error) {
142-
console.error('Σφάλμα κατά την ανάκτηση δεδομένων χρήστη:', error);
160+
console.error('Σφάλμα στην ανάκτηση δεδομένων χρήστη:', error);
143161
return;
144162
}
145163
getUserPosts(userData.id, handlePosts);
146164
};
147165

148166
const handlePosts = (error, posts) => {
149167
if (error) {
150-
console.error('Σφάλμα κατά την ανάκτηση αναρτήσεων:', error);
168+
console.error('Σφάλμα στην ανάκτηση αναρτήσεων:', error);
151169
return;
152170
}
153171
getPostComments(posts[0].id, handleComments);
154172
};
155173

156174
const handleComments = (error, comments) => {
157175
if (error) {
158-
console.error('Σφάλμα κατά την ανάκτηση σχολίων:', error);
176+
console.error('Σφάλμα στην ανάκτηση σχολίων:', error);
159177
return;
160178
}
161179
console.log('Σχόλια:', comments);
@@ -166,7 +184,7 @@ fetchUserData(handleUserData);
166184

167185
Η διαφορά μεταξύ των δύο προσεγγίσεων μπορεί να απεικονιστεί ως εξής:
168186

169-
**Callback Hell (Πυραμίδα 🔺)**
187+
**Callback Hell:**
170188

171189
```
172190
fetchUserData(
@@ -178,7 +196,7 @@ fetchUserData(
178196
)
179197
```
180198

181-
**Ονομασμένες Συναρτήσεις (Αλυσίδα 🔗)**
199+
**Ονομασμένες Συναρτήσεις:**
182200

183201
```
184202
fetchUserData → handleUserData
@@ -190,7 +208,7 @@ fetchUserData → handleUserData
190208
getPostComments → handleComments
191209
```
192210

193-
Η προσέγγιση με ονομασμένες συναρτήσεις δημιουργεί μια οριζόντια ροή αντί για μια βαθιά ένθετη δομή, κάνοντας τον κώδικα πιο ευανάγνωστο και ευκολότερο στη συντήρηση.
211+
Η προσέγγιση με ονομασμένες συναρτήσεις δημιουργεί μια οριζόντια ροή αντί για μια εμφωλευμένη δομή, κάνοντας τον κώδικα πιο ευανάγνωστο και ευκολότερο στη συντήρηση.
194212

195213
## Σύγκριση με Σύγχρονες Προσεγγίσεις
196214

@@ -200,10 +218,12 @@ fetchUserData → handleUserData
200218
| ------------- | ----------------------------------------------------- | ------------------------------------------- |
201219
| `Callbacks` | Απλή υλοποίηση, ευρεία υποστήριξη | Callback hell, δύσκολος χειρισμός σφαλμάτων |
202220
| `Promises` | Αλυσιδωτές λειτουργίες, καλύτερος χειρισμός σφαλμάτων | Πιο περίπλοκη σύνταξη από τα callbacks |
203-
| `Async/Await` | Συγχρονική σύνταξη, εύκολη ανάγνωση | Απαιτεί κατανόηση των Promises |
221+
| `async/await` | Συγχρονική σύνταξη, εύκολη ανάγνωση | Απαιτεί κατανόηση των Promises |
222+
223+
:::tip[Συμβουλή]
204224

205-
:::tip Συμβουλή
206225
Παρόλο που οι callbacks θεωρούνται παλαιότερη τεχνολογία, είναι σημαντικό να τις κατανοήσουμε καθώς πολλές βιβλιοθήκες και APIs εξακολουθούν να τις χρησιμοποιούν.
226+
207227
:::
208228

209229
Στην επόμενη ενότητα, θα εξετάσουμε τα `Promises`, που προσφέρουν έναν πιο κομψό τρόπο διαχείρισης ασύγχρονων λειτουργιών.

0 commit comments

Comments
 (0)