Τι είναι οι γεννήτριες στο Dart (sync* και async*) και πώς λειτουργούν;
sobes.tech AI
Απάντηση από AI
Οι γεννήτριες στο Dart είναι συναρτήσεις που επιστρέφουν μια ακολουθία τιμών καθώς παράγονται, αντί ολόκληρο το αποτέλεσμα αμέσως. Χρησιμοποιούνται οι λέξεις-κλειδιά sync* για συγχρονικές γεννήτριες και async* για ασύγχρονες γεννήτριες.
Συγχρονικές γεννήτριες (sync*)
Επιστρέφουν ένα αντικείμενο τύπου Iterable. Χρησιμοποιούν τη λέξη-κλειδί yield για να εκπέμψουν την επόμενη τιμή. Η ροή εκτέλεσης διακόπτεται μέχρι να ζητηθεί η επόμενη τιμή (π.χ., σε έναν βρόχο for-in).
Iterable<int> countUpTo(int max) sync* {
for (int i = 1; i <= max; i++) {
yield i; // Εκπέμπει την τιμή
}
}
Ασύγχρονες γεννήτριες (async*)
Επιστρέφουν ένα αντικείμενο τύπου Stream. Χρησιμοποιούν τη λέξη-κλειδί yield για να εκπέμψουν την επόμενη τιμή. Χρησιμοποιούν επίσης yield* για να εκπέμψουν όλες τις τιμές ενός άλλου Stream. Η ροή εκτέλεσης διακόπτεται και συνεχίζεται όταν εμφανίζεται ένα νέο ασύγχρονο γεγονός.
Stream<int> countUpToAsync(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(milliseconds: 100)); // Προσομοίωση ασύγχρονης εργασίας
yield i; // Εκπέμπει την τιμή
}
}
Πώς λειτουργούν:
Όταν καλείται η γεννήτρια, το σώμα της συνάρτησης δεν εκτελείται αμέσως. Επιστρέφεται ένα αντικείμενο (είτε Iterable, είτε Stream). Η πραγματική εκτέλεση του σώματος ξεκινά μόνο όταν προσπαθήσουμε να πάρουμε την τιμή για πρώτη φορά. Όταν φτάσουμε στη λέξη-κλειδί yield, η τιμή μεταβιβάζεται "εκτός" και η κατάσταση της συνάρτησης αποθηκεύεται. Η εκτέλεση του σώματος διακόπτεται. Όταν προσπαθούμε να πάρουμε την επόμενη τιμή, η εκτέλεση συνεχίζεται από το σημείο που σταμάτησε, μέχρι το επόμενο yield ή το τέλος της συνάρτησης.
Διαφορές:
| Χαρακτηριστικό | sync* (Συγχρονικό) | async* (Ασύγχρονο) |
|---|---|---|
| Τύπος επιστροφής | Iterable |
Stream |
| Λέξεις-κλειδιά | sync*, yield |
async*, yield, yield* |
Χρήση await |
Δεν επιτρέπεται | Επιτρέπεται |
| Διακοπή | Μέχρι να ζητηθεί η επόμενη τιμή | Μέχρι να εμφανιστεί το επόμενο ασύγχρονο γεγονός |