Qu'est-ce que les générateurs en Dart (sync* et async*) et comment fonctionnent-ils?
sobes.tech IA
Réponse de l'IA
Les générateurs en Dart sont des fonctions qui renvoient une séquence de valeurs au fur et à mesure de leur génération, plutôt que tout le résultat d'un coup. On utilise les mots-clés sync* pour les générateurs synchrones et async* pour les générateurs asynchrones.
Générateurs synchrones (sync*)
Renvoient un objet de type Iterable. Utilisent le mot-clé yield pour émettre la valeur suivante. Le flux d'exécution est suspendu jusqu'à ce que la prochaine valeur soit demandée (par exemple, dans une boucle for-in).
Iterable<int> countUpTo(int max) sync* {
for (int i = 1; i <= max; i++) {
yield i; // Émission de la valeur
}
}
Générateurs asynchrones (async*)
Renvoient un objet de type Stream. Utilisent le mot-clé yield pour émettre la valeur suivante. Utilisent aussi yield* pour émettre toutes les valeurs d'un autre Stream. Le flux d'exécution est suspendu et repris lorsqu'un nouvel événement asynchrone se produit.
Stream<int> countUpToAsync(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(milliseconds: 100)); // Simulation de travail asynchrone
yield i; // Émission de la valeur
}
}
Fonctionnement :
Lorsqu'on appelle la fonction génératrice, le corps de la fonction ne s'exécute pas immédiatement. Un objet (soit Iterable, soit Stream) est renvoyé. L'exécution réelle du corps commence uniquement lorsque l'on tente d'obtenir la valeur pour la première fois. Lorsqu'on atteint le mot-clé yield, la valeur est transmise "vers l'extérieur" et l'état de la fonction est sauvegardé. L'exécution du corps est suspendue. Lors de la tentative suivante d'obtenir une valeur, l'exécution reprend là où elle s'était arrêtée, jusqu'au prochain yield ou la fin de la fonction.
Différences :
| Caractéristique | sync* (Synchrone) | async* (Asynchrone) |
|---|---|---|
| Type renvoyé | Iterable |
Stream |
| Mots-clés | sync*, yield |
async*, yield, yield* |
Utilisation de await |
Non autorisé | Autorisé |
| Suspension | Jusqu'à la demande de la valeur suivante | Jusqu'à l'apparition de la prochaine valeur asynchrone |