Sobes.tech
Middle

Τι είναι οι γεννήτριες στο 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 Δεν επιτρέπεται Επιτρέπεται
Διακοπή Μέχρι να ζητηθεί η επόμενη τιμή Μέχρι να εμφανιστεί το επόμενο ασύγχρονο γεγονός