Essayer de comprendre les générateurs / yield dans node.js - qu'est-ce qui exécute la fonction asynchrone?
Node.js a maintenant générateurs.
Ma compréhension est que les générateurs peuvent être utilisés pour écrire du code qui semble être beaucoup plus linéaire et évite de rappel de l'enfer et de la pyramide de doom style de codage.
De sorte à ce point, ma compréhension est que l'intérieur d'un générateur de code s'exécute jusqu'à ce qu'il atteigne un "rendement" de la déclaration. L'exécution de la fonction de générateur suspend à ce point. Le yield
déclaration spécifie une valeur de retour qui peut être une fonction. Habituellement, ce serait un blocage de la fonction d'e/S qui aurait normalement besoin d'être exécutée de manière asynchrone.
Le rendement de retour de la fonction est retourné à ce que appelé le générateur.
Ma question est de savoir ce qui se passe à ce point? Qu'est-ce exactement exécute le blocage de la fonction d'e/S que le rendement de retour?
Est-il exact que pour écrire générateur/rendement de code qui semble être linéaire, il doit y avoir un tri spécifique de la fonction qui appelle le générateur, une fonction qui parcourt le générateur et exécute chaque asynch fonction renvoyée par le rendement et renvoie le résultat de la asynch fonction de retour dans le générateur?
Il n'est toujours pas clair pour moi exactement comment le asynch fonction renvoyée par le rendement est exécuté. Si elle est exécutée par la fonction qui appelle le générateur, est-il exécuté de manière asynchrone? Je suppose donc raison de faire autrement entraînerait le blocage de comportement.
Pour résumer mes questions:
- À écrire "linéaire" asynch code avec des générateurs, est-il nécessaire pour qu'il y ait un appel de fonction qui effectue une itération sur le générateur, l'exécution a abouti à des fonctions de rappels et de retourner le résultat de la fonction de rappel de retour dans le générateur?
- Si la réponse à la question 1 est oui, exactement comment les a abouti à des fonctions exécutés de manière asynchrone?
Quelqu'un peut-il offrir une meilleure vue d'ensemble/résumé de la façon dont l'ensemble du processus fonctionne?
source d'informationauteur Duke Dougal
Vous devez vous connecter pour publier un commentaire.
Lors de l'écriture de code asynchrone avec des générateurs vous avez affaire à deux types de fonctions:
function
. Ces fonctions ne peut pas rendement. Vous ne pouvez pas écrire du code asynchrone synchronisé de style avec eux parce qu'ils exécuter jusqu'à la fin; vous ne pouvez traiter asynchrone achèvement par le biais de rappels (à moins que vous invoquez la puissance supplémentaire comme lenode-fibers
bibliothèque ou un code de transformation).function*
. Ces fonctions peut rendement. Vous pouvez écrire du code asynchrone synchronisé de style à l'intérieur d'eux parce qu'ils peuvent donner. Mais vous avez besoin d'un compagnon de la fonction qui crée le générateur, gère les rappels et reprend la générateur avec unnext
appel à chaque fois un rappel des feux.Il y a plusieurs bibliothèques qui mettent en œuvre des compagnon fonctions. Dans la plupart de ces bibliothèques, le compagnon de la fonction ne gère qu'un seul
function*
à la fois et vous devez mettre un wrapper autour de chaquefunction*
dans votre code. La galaxie de la bibliothèque (que j'ai écrit) est un peu spécial car il peut gérerfunction*
l'appel à d'autresfunction*
sans intermédiaire wrappers. Le compagnon de la fonction est un peu délicate car il doit composer avec une pile de générateurs.Le flux d'exécution peut être difficile à comprendre en raison de la petite
yield/next
danse entre votrefunction*
et le compagnon de la fonction. Une façon de comprendre le flux est d'écrire un exemple avec la bibliothèque de votre choix, ajouterconsole.log
états à la fois dans le code et dans la bibliothèque, et de l'exécuter.Je ne pense pas que les générateurs de faire tâche asynchrone de la manipulation. Avec des générateurs, une seule chose est en cours d'exécution en même temps, c'est juste que d'une fonction peut arrêter l'exécution et de contrôle des laissez-passer à une autre fonction. Par exemple,
Si vous lisez des articles sur nodejs générateurs:
...ils emploient tous des fonctions supplémentaires/bibliothèques à ajouter en mode d'exécution asynchrone.
Oui. Appelons-le "lanceur".
À l'intérieur du générateur, de vous produire un tableau avec: la fonction et ses paramètres. Dans le contrôle de l'appelant (lanceur), vous utilisez fn.appliquer(..,callback) pour appeler la async, en mettant l'appel à "générateur.suivant(données);" (cv) à l'intérieur de la fonction de rappel.
async fonction est exécutée de manière asynchrone, mais le générateur sera "suspendu" au point de céder, jusqu'à ce que la fonction de rappel est appelée (et puis "générateur.suivant(données)" est exécuté)
Travail plein de lib et des échantillons:
https://github.com/luciotato/waitfor-es6