En ce qui concerne Generator, tout le monde évoquera des sujets tels que l'asynchrone. Cela était évidemment dû à quelque chose de bizarre. Iterator doit être étroitement lié à Generator. Utiliser Generator pour gérer le traitement asynchrone peut être une chose à laquelle seuls certains programmeurs C# pourraient penser. Bien sûr, cet usage comporte un ensemble complet de choses, mais personnellement, je ne l'aime pas.
Si vous devez connecter Generator en mode asynchrone, le seul point est le moment de l'appel suivant. Parce que next peut être appelé de manière asynchrone, Generator peut être abusé de manière asynchrone.
Mais je pense que même si la méthode suivante peut être appelée de manière asynchrone, la bonne façon de l'utiliser devrait être de manière synchrone. Au moins lorsqu'une instance de Generator est utilisée dans une boucle for-of ou une déstructuration [...obj], next est appelé en continu.
En plus des problèmes synchrones et asynchrones de next, les paramètres de next posent également problème. Étant donné que les paramètres transmis lors de l'appel de next seront utilisés comme valeur de retour de l'opérateur de rendement, les générateurs disposent de moyens plus riches pour les utiliser. Au début de Python, le rendement était une instruction plutôt qu'un opérateur, donc une telle utilisation n'existait pas. Les versions ultérieures utilisaient le rendement comme opérateur, de sorte que divers pièges sont apparus.
Lors de l'utilisation d'une instance de générateur comme itérateur, next ne sera pas appelé de manière asynchrone et ne sera pas non plus transmis en paramètres. Je pense que c'est l'utilisation correcte de Generator. Ou pour le dire franchement, Generator est utilisé pour implémenter Iterator. Au moins, le nom Generator n’a pas d’autre signification. Voici un exemple d'utilisation :
Courez
<script> var match = function * (pattern, string) { var regexp = new RegExp(pattern, 'g'); for(let i; i = regexp.exec(string); yield i); }; for(let i of match('a', 'abcabcabc')) { console.log(i); } </script>