Quel est le mot clé yield en JavaScript?
J'ai entendu parler d'un "rendement" clé en JavaScript, mais je l'ai trouvé très pauvres de la documentation à ce sujet. Quelqu'un peut-il m'expliquer (ou de recommander un site qui explique) son utilisation et à quoi il sert?
- Il voulait probablement dire 'Rendement' bytes.com/topic/python/answers/685510-yield-keyword-usage
- Ouais, mais en JS pas phyton
- c'est expliqué dans SOCIÉTÉ, mais je pense que cela ne fonctionne que pour firefox, droit? Comment portable est-il? De toute façon à présent sur Chrome ou node.js? PD: désolé, c'est le Javascript v1.7+, de sorte que la propriété à regarder lors de la recherche de soutien.
- Les générateurs sont disponibles dans le Nœud depuis v0.11.2
- cependant, seulement derrière un drapeau. Ils sont pris en charge nativement dans ioJS
- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
- Attention:
yield
n'est pas pris en charge par Internet Explorer
Vous devez vous connecter pour publier un commentaire.
La MDN documentation est très bonne, de l'OMI.
La fin de la réponse, probablement, tout le monde connaît
yield
maintenant, mais certains d'une meilleure documentation est venu le long.Adapter un exemple de "Javascript de l'Avenir: les Générateurs" par James Long de l'officiel Harmonie standard:
Donc
yield
est le genre dereturn
: vous obtenez quelque chose en retour.return x
renvoie la valeur dex
, maisyield x
retourne une fonction qui vous donne une méthode pour effectuer une itération en vue de la prochaine valeur. Utile si vous avez un potentiellement les plus gourmands en mémoire de la procédure que vous pouvez interrompre au cours de l'itération.function* foo(x){
il*
jeton. Si oui ou non vous en avez besoin dépend du type de futur que vous retournez. Le détail est long: GvR explique pour le Python de la mise en œuvre, sur lequel le Javascript de la mise en œuvre est modélisé. À l'aide defunction *
aura toujours raison, même si dans certains cas un peu plus de ressources que lesfunction
avecyield
.*
ajouté après lefunction
mot-clé.function *
etyield
, et ajout de la cité d'erreur ("Un début d'erreur est déclenchée si un rendement ou de rendement* expression se produit dans un non-générateur de fonction"). Mais, l'original Javascript 1.7 mise en œuvre dans Firefox n'a pas besoin de l'*
. Mise à jour de répondre en conséquence. Merci!function*
, sans un rendement dans le corps, est juste une fonction normale?De simplifier ou de l'élaboration de Nick Sotiros' réponse (je pense que c'est génial), je pense qu'il est préférable de décrire comment on pourrait commencer à coder avec
yield
.À mon avis, le plus grand avantage de l'utilisation de
yield
est qu'il permettra d'éliminer toutes les imbriquée rappel problèmes que nous voyons dans le code. Il est difficile de voir comment, en premier lieu, c'est pourquoi j'ai décidé d'écrire cette réponse (pour moi, et j'espère que d'autres!)La façon dont il le fait, c'est en introduisant l'idée d'une co-routine, qui est une fonction qui peut volontairement arrêter/mettre en pause jusqu'à ce qu'il obtient ce dont il a besoin. En javascript, c'est dénoté par
function*
. Seulementfunction*
les fonctions peuvent utiliseryield
.Voici quelques exemples de javascript:
C'est maladroit, parce que maintenant votre code (qui, évidemment, doit attendre pour ce
loadFromDB
appel) doit être à l'intérieur de ce vilain à la recherche de rappel. C'est mauvais pour quelques raisons...})
laquelle vous avez besoin de garder une trace de partoutfunction (err, result)
jargonresult
D'autre part, avec
yield
, tout cela peut être fait en une ligne avec l'aide de la belle co-routine cadre.Et alors maintenant, votre fonction principale sera de rendement le cas échéant quand il a besoin d'attendre pour les variables et les choses à charger. Mais maintenant, pour l'exécuter, vous devez appeler un normal (non-coroutine fonction). Un simple co-routine cadre de résoudre ce problème, de sorte que tous vous avez à faire est de lancer ce:
Et de démarrage est défini (à partir de Nick Sotiro réponse)
Et maintenant, vous pouvez avoir de belles code qui est beaucoup plus lisible, facile à supprimer, et pas besoin de jouer avec des tirets, des fonctions, etc.
Une observation intéressante est que, dans cet exemple,
yield
est en fait juste un mot-clé, vous pouvez mettre de l'avant une fonction avec une fonction de rappel.Devrait afficher "Hello World". De sorte que vous pouvez réellement faire une fonction de rappel en utilisant
yield
en créant tout simplement la même signature de fonction (sans cb) et le retourfunction (cb) {}
, comme suit:Nous espérons qu'avec cette connaissance, vous pouvez écrire plus propre, plus lisible le code qui est facile à supprimer!
function*
est juste une fonction régulière sans un rendement?function *
est une fonction contient rendement. C'est une fonction spéciale appelée générateur.yield
de partout, je suis sûr que cela fait plus de sens que les rappels, mais je ne vois pas en quoi c'est plus lisible que les rappels.C'est très Simple, C'est la façon dont il fonctionne
yield
mot-clé permet simplement de pause et reprendre une fonction en tout temps de manière asynchrone.Prendre cette simple générateur fonction:
JS:
Jusqu'à ce que vous appelez la _process.next() il l'habitude de exécuter le 2 premières lignes de code, puis le de rendement sera pause la fonction.
Pour reprendre la fonction jusqu'à la prochaine pause point (mot clé yield) vous devez appeler _process.next().
Mais, tandis que le rendement effectue cette pause et de reprendre des comportements qu'il peut retourner des résultats ainsi
{value: any, done: boolean}
selon la dernière fonction que nous n'avons pas d'émettre des valeurs. Si nous explorons la sortie précédente, il fera preuve de la même
{ value: undefined, done: false }
avec la valeur undefined.
Permet de creuser pour le mot clé yield. En option vous pouvez ajouter expression et définir attribuer une valeur par défaut valeur facultative. (Officiel doc syntaxe)
expression: Valeur de retour de la fonction de générateur
rv: Retourne la valeur facultative qui est passé à la génératrice de la méthode next ()
Essayez-Le Maintenant
Usages
Références:
Pour donner une réponse complète:
yield
est travail similaire àreturn
, mais dans un générateur.Comme pour l'communément donné l'exemple, cela fonctionne comme suit:
Mais theres également un deuxième but de le mot clé yield. Il peut être utilisé pour envoyer les valeurs de la génératrice.
À préciser, un petit exemple:
Cela fonctionne, que la valeur
2
est attribué ày
, en l'envoyant sur le générateur, après elle s'est arrêtée à la première de rendement (qui a retourné0
).Cela nous permet de vraiment des trucs funky. (rechercher coroutine)
Il est utilisé pour itérateur-générateurs. Fondamentalement, il vous permet de vous faire une (potentiellement infinie) de séquence à l'aide du code de procédure. Voir La documentation de Mozilla.
yield
peut également être utilisé pour éliminer le rappel de l'enfer, avec une coroutine cadre.Séquence de Fibonacci générateur en utilisant le mot clé yield.
Dépendance entre asynchrone en javascript appels.
Un autre bon exemple de la façon dont le rendement peut être utilisé.
JS:
Avant de vous en apprendre davantage sur le rendement que vous devez savoir à propos des générateurs. Les générateurs sont créés à l'aide de la
function*
de la syntaxe. Générateur de fonctions de ne pas exécuter le code, mais au lieu de cela renvoie un type d'itérateur appelé générateur. Lorsqu'une valeur est donnée à l'aide de lanext
méthode, le générateur de fonction continue l'exécution jusqu'à ce qu'il tombe sur un mot clé yield. À l'aide deyield
vous donne en retour un objet contenant deux valeurs, l'une est de la valeur et de l'autre se fait (boolean). La valeur peut être un tableau, objet, etc.Un exemple simple: