Sobes.tech
Middle

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