Koa / Co / Bluebird ou Q / Générateurs / Promesses / Thunks interaction? (Node.js)
Je suis enquêter sur la construction d'une web app en partie avec Koa, mais je ne suis pas tout à fait une poignée sur le comment, quand et le pourquoi du choix entre les - et l'application de la plage de soutien "faire async plus facile" technologies et d'approches (ci-dessous).
Ensemble disparate d'orientation sur le web à propos de ce sujet encore des feuilles de choses floues, particulièrement en ce qui concerne l'évolution des meilleures pratiques, ou au moins des meilleures, et dans quelles circonstances. Il semble y avoir peu ou rien sur le web qui met tout dans le contexte.
Je suis en espérant que les réponses à ce gros cul tentaculaire post peut corriger que. Aussi peut-être les questions ci-dessous peut inspirer quelqu'un pour écrire approfondie blog ou pour répondre à cette question. Mon sentiment est que je ne suis même pas près de le seul qui bénéficieront de cette.
Je serais heureux si le brillant de la communauté peut aider à répondre et apporter de la clarté aux questions suivantes en ce qui concerne les technologies énumérés ci-dessous (en caractères gras):
-- a) Comment, et dans quelles circonstances (selon le cas) sont-ils des compléments, suppléments, des substituts, et/ou de chevauchement des solutions de l'un à l'autre?
-- b) Quels sont leurs compromis à l'égard de la vitesse de la performance, la gestion des erreurs la facilité et le débogage de la facilité?
-- c) Quand, où, et pourquoi il peut être préférable d'utiliser "ce" et "la que" la technologie, les technologies de l'-combo, et/ou approche?
-- d) quelles technologies ou approches, le cas échéant, peut être "variation des étoiles".
(En espérant que les opinions qui font partie de réponses peut être bien expliqué.)
==============================
Technologies:
* Koa *
Ma compréhension:
Koa est un minimum de la fondation pour le Nœud de créer des applications orientées pour prendre avantage de ECMAScript 6 fonctions, une fonction en particulier de générateurs.
* Co *
Ma compréhension:
- Co est une bibliothèque d'utilitaires pour l'exécution d'ECMAScript 6 (générateurs qui sont indigènes au Nœud .011 harmonie), avec l'objectif de allieve certains/beaucoup(?) de la nécessité d'écrire du code réutilisable pour l'exécution et la gestion des générateurs.
- Co est intrinsèquement partie de Koa(?).
Questions spécifiques:
-- Si et comment utiliser la Co différemment en Koa que dans un non-Koa contexte. En d'autres termes, ne Koa entièrement façade Co?
-- Est susceptible d'être remplacé en Koa avec quelques autres, comme générateur de bibliothèque, s'il y a eu une meilleure? Y at-il?
* Promesse de Bibliothèques telles que le "Q" et Bluebird *
Ma compréhension:
-- Ils sont en un sens "polyfills" pour implmententing les Promesses/A+ spec, si et jusqu'à ce que le Nœud s'exécute en mode natif que spec.
-- Ils ont quelques autres non-spec commodité des utilitaires pour faciliter l'utilisation des promesses, comme Bluebird est promisfyAll utilitaire.
Questions spécifiques:
-- Ma compréhension est la ECMAScript 6 spec ne/ne reflètent en grande partie les Promesses/A+ spec, mais tout de même, Nœud 0.11 v harmonie n'est pas nativement de mettre en œuvre des Promesses. (Est-ce correct?) Cependant, quand elle ne, va de technologies telles que Q et Bluebird être sur leur chemin?
-- J'ai lu quelque chose à l'effet que le "Q" et Bluebird soutien des générateurs. Qu'est-ce que cela signifie? Cela ne signifie en partie que, par exemple, ils sont à un certain degré, à condition que la même utilité que le Co, et si oui, à quel degré?
* Thunks et les Promesses *
Je pense avoir une juste une poignée sur ce qu'ils sont, mais en espérant que quelqu'un peut fournir une présentation succincte et claire "elevator pitch" définition sur ce que chacun est, et bien sûr, comme demandé ci-dessus, à expliquer quand utiliser l'un contre l'autre, dans un Koa contexte et pas en elle.
Questions spécifiques:
-- Pro et les inconvénients à l'utilisation de quelque chose comme Bluebird est promisfy, par rapport à-dire à l'aide de Thunkify (sur github. com/visionmedia/node-thunkify)?
==============================
De donner quelques explications complémentaires sur ce post et ses questions, il pourrait être intéressant si Koa techniques présentées dans la suite des pages web pourrait être discuté et contrastées (especiallly sur un pros vs inconvénients de base):
-- a) www.marcusoft . net/2014/03/koaintro.html (Où est le thunks ou des promesses, ou ne suis-je pas voir quelque chose?)
-- b) strongloop . com/strongblog/node-js-express-introduction-koa-js-zone (Encore une fois, où est la thunks ou promesses?)
-- c) github . com/koajs/koa/blob/master/docs/guide.md (Ce que le "prochain" argument assimiler, et ce jeu il et où?)
-- d) blog.peterdecroos . com/blog/2014/01/22/javascript-générateurs-premières impressions (Pas dans un Koa contexte, mais présente l'utilisation de Co avec une promesse de la bibliothèque (Bluebird), donc je suis en supposant que la technique/modèle présenté ici se prête à l'utilisation en Koa(?). Si oui, comment?
Merci à tous!
- Bluebird promisify avec Bluebird coroutine pour le générateur est la méthode la plus rapide et de loin. Il arrive aussi d'offrir le meilleur debuggability options avec de longues traces de pile à l'heure actuelle. Je dirais que c'est un bon pari.
- Aussi, c'est comme un million de questions. Certaines bonnes, certaines trop opinion fondée.
- Salut Ben - Oui, je sais, c'est s'aventure dans l'opinion, mais lors de la demande de considérations pour mettre un système, o
- Merci Ben. (mis soumettre ci-dessus) Lire de bonnes choses à propos de Bluebird. Il semble bien que bb-coroutine ne fonctionne pas w/ thunks, seulement des promesses. Alors, quel est l'inconvénient de perdre la possibilité de travailler w/ thunks, en particulier dans le contexte de Koa? (Notez "stackoverflow.com/questions/22134167/co-js-and-bluebird-js-whats-the-difference" une allusion à BB de travail un jour w/ thunks.) 2ème, serait-bb-coroutine remplacer complètement le Co en Koa? Si oui, comment? Semble que les deux sont jointes au niveau des hanches? Quant à l'opinion, "ouais", mais quand le sujet est des considérations pour la construction d'un système, d'opinion devient une partie de l'équation.
- Bluebird travaille avec les thunks, jetez un oeil à
addYieldHandler
. Beaucoup de bonnes questions générer un certain degré d'opinion basée sur les experts de l'expérience, mais les réponses à cette question ont tendance à être presque entièrement basé sur des opinions, plutôt que des faits, des références, ou des compétences spécifiques. - Co est une bibliothèque créée par l'express de l'auteur à l'écriture non bloquante code facilement. Habituellement, nous avons à travailler avec des rappels et async fonctions, qui peuvent devenir laid. Le chaînage avec élégance peut être un défi. Dans l'express, chaînes de serveur différents middleware. Koa est comme l'express, c'est un middleware. Mais il utilise le co pour la gestion de l'intérieur. Le hic, c'est que les générateurs sont bons, mais ils sont synchrones. Vous devez donc vous promet de travailler avec eux. Co fait pour vous.
- Ce n'est pas une QA, mais une discussion. Par conséquent, il est adapté pour un forum, pas pour SI.
- J'apprécie l'effort que vous mettez dans cette question, contrairement à certaines personnes, mais c'est hors sujet ici. Essayez les salles de chat.
- les salles de chat de ne pas laisser les informations disponibles afin d'aider les futurs téléspectateurs
Vous devez vous connecter pour publier un commentaire.
J'ai travaillé presque longuement avec les générateurs depuis un mois maintenant donc je peux peut-être prendre un coup de couteau à présent. Je vais essayer de garder les opinions à un minimum. Espérons que cela aide à clarifier la confusion.
Partie de la raison de l'absence de meilleures pratiques et de meilleures explications, c'est que cette fonctionnalité est encore si nouveau en javascript. Il y a encore très peu d'endroits que vous pouvez utiliser des générateurs de node.js et firefox étant le plus important, bien que firefox s'écarte de la norme un peu.
Je tiens à noter qu'il existe des outils comme traceur et régénérateur qui va vous permettre de les utiliser pour le développement et vous permettre de les transformer en semi-équivalent ES5 donc, si vous trouvez à travailler avec eux plaisante, puis il n'y a aucune raison de ne pas commencer à les utiliser, à moins que vous ciblez archaïque navigateurs.
Générateurs
Générateurs n'ont pas pensé à l'origine comme un moyen de gérer asynchrone contrôle de flux, mais ils fonctionnent à merveille à elle. Les générateurs sont essentiellement itérateur fonctions qui permettent l'exécution de pause et de reprise grâce à l'utilisation de la récolte.
Le mot clé yield dit essentiellement: de retour cette valeur pour cette version, et je vais reprendre là où je l'ai laissé éteint lorsque vous appelez la méthode next() de nouveau sur moi.
Générateur de fonctions sont les fonctions spécifiques qu'ils n'exécutent pas la première fois qu'ils font appel, mais plutôt retourne un itérateur objet avec quelques méthodes sur elle et la capacité à être utilisé dans des boucles et de la matrice de compréhensions.
send (): envoie une valeur dans le générateur de le traiter comme la dernière valeur de rendement et continue de la prochaine itération
next(),: Cela continue, la prochaine itération de la génératrice
throw(): Cette déclenche une exception DANS le générateur à l'origine du générateur de lancer l'exception comme si c'était de la dernière instruction rendement.
close(): Cela force le générateur de revenir de l'exécution et des appels n'importe enfin le code du générateur qui permet de finale de la gestion d'erreur se déclenche si nécessaire.
Leur capacité à être mis en pause et la reprise est ce qui le rend si puissant à la gestion du contrôle de flux.
Co
Co a été construit autour de la capacité des générateurs de faire de la manipulation de flux de contrôle plus facile. Il ne prend pas en charge toutes les choses que vous pouvez faire avec des générateurs, mais vous pouvez utiliser la plupart d'entre eux par le biais de l'utilisation avec moins passe-partout et des maux de tête. Et pour le contrôle de flux, je n'ai pas trouvé que j'avais besoin de quelque chose en dehors de ce que co fournit déjà. Bien que pour être honnête je n'ai pas essayé l'envoi d'une valeur dans un générateur de flux de contrôle, mais qui apporte quelques possibilités intéressantes....
Il y a d'autres générateur de bibliothèques de certains d'entre eux que je peux penser à du haut de ma tête sont suspendre, et gen-run. Je les ai tous essayés et co offre le plus de flexibilité. Suspendre peut-être un peu plus facile à suivre si vous n'êtes pas habitué à des générateurs encore, mais je ne peux pas dire avec autorité.
Autant que le nœud et les meilleures pratiques en aller, je dirais co est actuellement à la réussite des mains vers le bas avec le montant de l'aide des outils qui ont été créés pour aller avec elle. Avec de suspendre la plus probable coureur.
Co travaille à la fois avec des promesses et des thunks et ils sont utilisés pour l'instruction rendement, de sorte que le co sait quand pour poursuivre l'exécution du générateur au lieu de vous manuellement à l'appel à next(). Co prend également en charge l'utilisation de générateurs électriques, générateur de fonctions, d'objets et de tableaux pour plus de contrôle de flux d'appui.
En produisant un tableau ou d'un objet, vous pouvez avoir co effectuer des opérations en parallèle sur toutes les donné des éléments. En cédant à un générateur de fonction co délégué appels supplémentaires à la nouvelle générateur jusqu'à ce qu'il soit complété et puis reprendre l'appel suivant sur le générateur de courant, ce qui vous permet de créer très intéressant de flux de mécanismes de contrôle avec un minimum de code réutilisable.
Promesses
Alors que j'ai dit que j'avais garder des opinions à un minimum, je voudrais dire que pour moi les promesses sont probablement les plus difficiles concept à saisir. Ils sont un outil puissant pour la mise à jour du code, mais ils sont difficiles à saisir les rouages de et pouvez venir avec un certain nombre de pièges utilisés pour les avancées de contrôle de flux.
La meilleure façon que je peux penser à expliquer les promesses, c'est qu'ils sont un objet retourné par une fonction qui maintient l'état de la fonction et une liste de rappels à appeler lorsque l'un spécifique de l'état de l'objet est ou a été conclu.
La promesse bibliothèques elles-mêmes ne sera pas aller n'importe où n'importe quand bientôt. Ils ajoutent beaucoup de agréable de nantis pour les promesses inclus done() qui ne se trouvent pas dans l'ES6 spec. Ne pas mentionner le fait que les mêmes bibliothèques peuvent être utilisées sur le navigateur et dans le nœud, nous allons les avoir pour un bon long moment.
Thunks
Thunks sont juste des fonctions qui prennent un seul paramètre de rappel et revenir une autre fonction qu'ils sont de l'emballage.
Cela crée une fermeture qui permet à l'appelant de code pour instancier la fonction de passage dans son rappel de sorte qu'il peut être dit que lorsque la méthode est terminée.
Thunks sont assez simple à comprendre et à utiliser à mon avis, mais ils ne sont pas le bon outil pour tout. Par exemple spawn est une grande douleur pour créer un thunk, vous pouvez le faire, mais il n'est pas facile.
Thunks vs Promet
Ce ne sont pas mutuellement exclusives et peuvent facilement être utilisés ensemble, mais il est généralement mieux pour votre santé mentale d'en choisir un et de s'y tenir. Ou à tout le moins, choisir une convention de sorte que vous pouvez facilement dire qui est qui. Thunks courir plus vite à partir de mon expérience, mais je n'ai pas comparé ça. La plupart de ce est probablement parce que c'est un plus petit abstraction et ne pas avoir d'erreur mécanismes de gestion intégrée.
Vous aurez généralement être construire quelque chose qui nécessite la gestion d'erreur si de sorte que la performance globale des gains de thunks pourrait facilement même en dehors ou à côté, en faveur de promesses en fonction de votre code.
Quand Utiliser
Générateurs - Quand vous pouvez sans risque dire que votre demande sera capable de courir sur le bord de saignement, si c'est firefox uniquement pour le navigateur ou le nœud > 0.11.3
J'ai été de les utiliser largement à la société que je suis maintenant et je ne pouvais pas être plus heureux avec le flux de contrôle et de mécanismes d'évaluation différée qu'ils permettent.
Promesses vs Thunks - Ce est vraiment à vous et comment vous êtes à l'aise de travailler avec chacun. Ils n'offrent pas les mêmes avantages, ni qu'ils résoudre le même problème. Promet de les aider à composer avec la async problème directement, thunks juste s'assurer une fonction prend le nécessaire rappel de paramètre pour un autre code pour passer en.
Vous pouvez les utiliser tous les deux ensemble et aussi longtemps que vous pouvez faire en sorte qu'il est évident que vous n'aurez pas un problème.
Promesses/Thunks avec des Générateurs - je suggère de faire cela quand vous êtes à l'aide de générateurs de flux de contrôle. Il n'est pas nécessaire, mais c'est plus facile, tout comme l'utilisation de co comme une abstraction pour le contrôle de flux avec des générateurs est plus facile. Moins de code à taper, une maintenance plus facile, et moins de possibilités que vous aurez atteint un bord de cas que quelqu'un d'autre n'a pas rencontré encore.
Koa
Je ne vais pas entrer dans beaucoup de détails sur koa. Qu'il suffise de dire que c'est similaire à l'express, mais écrites pour profiter de générateurs. Cela lui donne des avantages uniques tels que faciliter la gestion des erreurs en cascade et de middleware. Il y a des moyens pour accomplir toutes ces tâches avant, mais ils n'étaient pas élégant et parfois pas les plus performantes.
Note Spéciale:
Les générateurs d'ouvrir une porte de possibilités que nous n'avons pas exploré encore. Tout comme ils peuvent être utilisés pour le contrôle de flux lorsque ce n'était pas leur conception initiale, je suis positif qu'ils peuvent être utilisés pour résoudre beaucoup d'autres problèmes que normalement, nous avons un problème avec javascript. Il sera sans doute plus brillant esprit que moi, que de savoir comment nous pouvons les utiliser, mais je serais au moins commencer à jouer avec eux et d'obtenir une meilleure compréhension de ce dont ils sont capables. Il y a encore plus de goodies pour les générateurs à venir dans l'ES.prochaine.