Wenn es um Generator geht, wird jeder Themen wie Asynchronität ansprechen. Dies wurde offensichtlich durch etwas Seltsames verursacht. Der Iterator sollte eng mit dem Generator verwandt sein, über den nur einige C#-Programmierer nachdenken würden. Natürlich umfasst diese Verwendung eine ganze Reihe von Dingen, aber ich persönlich mag sie nicht.
Wenn Sie den Generator asynchron verbinden müssen, kommt es nur auf den Zeitpunkt des nächsten Aufrufs an. Da next asynchron aufgerufen werden kann, kann Generator asynchron missbraucht werden.
Ich denke jedoch, dass die nächste Methode zwar asynchron aufgerufen werden kann, die korrekte Verwendung jedoch synchron sein sollte. Zumindest wenn eine Generator-Instanz in einer for-of-Schleife oder einer [...obj]-Destrukturierung verwendet wird, wird next kontinuierlich aufgerufen.
Zusätzlich zu den synchronen und asynchronen Problemen von next sind auch die Parameter von next ein Problem. Da die beim nächsten Aufruf übergebenen Parameter als Rückgabewert des Yield-Operators verwendet werden, stehen Generatoren umfassendere Möglichkeiten zur Verwendung zur Verfügung. Im frühen Python war yield eher eine Anweisung als ein Operator, daher gab es keine solche Verwendung. Spätere Versionen verwendeten yield als Operator, sodass verschiedene Fallstricke auftraten.
Wenn Sie eine Generator-Instanz als Iterator verwenden, wird next weder asynchron aufgerufen noch werden next in Parametern übergeben. Ich denke, das ist die richtige Verwendung von Generator. Oder um es ganz klar auszudrücken: Generator wird zur Implementierung von Iterator verwendet. Zumindest hat der Name Generator keine andere Bedeutung. Hier ist ein Anwendungsbeispiel:
Führen Sie
aus
<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>