Comment pensez-vous de la structure séquentielle AWS appels de service au sein de lambda donné à toutes les communications sont asynchrones?
Je viens de java arrière-plan, donc un peu un newbie sur le Javascript conventions nécessaires pour Lambda.
J'ai une fonction lambda qui est destiné à faire plusieurs AWS tâches dans un ordre particulier, en fonction du résultat de la tâche précédente.
Étant donné que chaque tâche présente ses résultats de manière asynchrone, je me demande si la bonne façon assurez-vous qu'elles se déroulent toutes dans le bon ordre, et les résultats de l'opération sont disponibles à l'invocation de la fonction suivante.
Il semble que j'ai à invoike chaque fonction dans le rappel de l'état de la fonction, mais il semble que ce sera une sorte de profonde imbrication et vous demandez-vous si c'est la bonne façon de le faire.
Par exemple sur de ces fonctions nécessite un DynamoDB getItem, à la suite d'un appel à SNS pour obtenir un point de terminaison, suivi par un SNS appel pour envoyer un message, suivi d'un DynamoDB écrire.
Quelle est la bonne façon de le faire que dans le lambda javascript, de la comptabilité pour tous que l'asynchronicité?
- avez-vous trouvé une solution?
Vous devez vous connecter pour publier un commentaire.
J'aime la réponse de @jonathanbaraldi mais je pense qu'il serait mieux si vous avez à gérer le contrôle de flux avec des Promesses. Le Q de la bibliothèque dispose de quelques fonctions de confort comme
nbind
qui permettent de convertir nœud style de rappel de l'API comme l'aws sdk en promesses.Donc, dans cet exemple, je vais envoyer un e-mail, et puis dès que l'e-mail de réponse est de retour, je vais envoyer un second message. C'est essentiellement ce qui a été demandé, l'appel de plusieurs services dans la séquence. Je suis à l'aide de la
then
méthode de promesses à gérer que dans un verticalement lisible. Aussi à l'aide decatch
pour gérer les erreurs. Je pense qu'il se lit beaucoup mieux tout simplement l'imbrication des fonctions de rappel.Je ne sais pas Lambda, mais vous devriez regarder dans le noeud async bibliothèque comme un moyen de séquence asynchrone fonctions.
async a rendu ma vie beaucoup plus facile et mon code beaucoup plus ordonnée sans la profonde imbrication problème que vous avez mentionné dans votre question.
Asynchrone classique code peut ressembler à:
Ont un look à la async doco sur le lien ci-dessus. Il y a beaucoup de fonctions utiles pour la série, parallèle, chute d'eau, et beaucoup plus. Async est activement maintenu et semble très fiable.
bonne chance!
Très spécifique de la solution qui vient à l'esprit est en cascade Lambda appels. Par exemple, vous pourriez écrire:
La totalité de ces fonctions, prendre la sortie à partir de la fonction précédente en entrée. Bien sûr, cela est très fine, et vous pouvez décider de groupe de certains appels. Cette façon de faire évite de rappel de l'enfer dans votre code JS au moins.
(Comme une note de côté, je ne suis pas sûr de savoir comment bien DynamoDB s'intègre avec les Lambda. AWS peut émettre des événements de modification d'enregistrements qui peuvent ensuite être traitées par Lambda.)
Réponse courte:
Puisque vous voulez exécuter dans un ordre spécifique, vous pouvez utiliser Async /Await en supposant que la fonction parent, vous appelez de est elle-même async.
Par exemple:
Afin d'exécuter un autre aws sdk tâche de même ajouter l'attendent et l' .promesse() extension de cette fonction (en supposant que c'est disponible).
Pour toute personne qui s'exécute dans ce fil et est actuellement à la recherche de simplement pousser les promesses d'un tableau et d'attendre que TOUT le tableau à la fin (sans égard à la promesse qui s'exécute en premier) je me suis retrouvé avec quelque chose comme ceci:
Espère que ça aide quelqu'un au hasard tombe sur cette via google comme je l'ai fait!
Je voudrais vous proposer la solution suivante, qui crée simplement une fonction imbriquée structure.
Ce que cela fait, c'est de copier toutes les variables de l'appel de la fonction que vous voulez faire, alors nids à l'intérieur de l'appel précédent. Vous aurez envie de planifier vos événements à l'envers. C'est vraiment la même chose que de faire une pyramide de rappels, mais quand vous ne savez pas à l'avance la structure ou de la quantité d'appels de fonction. Vous devez envelopper la fonction de fermeture de sorte que la valeur correcte est copié.
De cette façon, je suis en mesure de séquence AWS appels de service tels qu'ils vont 1-2-3 et à la fin avec la clôture du contexte. Sans doute, vous pourriez aussi de la structure comme une pile à la place de cette pseudo-récursivité.
Viens de voir ce vieux fil. Notez que les futures versions de JS va améliorer tout ça. Jetez un oeil à la ES2017 async/await syntaxe qui rationalise un async imbriquée rappel désordre dans un récipient propre de synchronisation comme le code.
Il y a maintenant quelques polyfills que peut vous apporter cette fonctionnalité sur ES2016 syntaxe.
Comme un dernier PTI - AWS Lambda prend désormais en charge .Net De Base qui fournit cette énergie propre async syntaxe de la boîte.
J'ai trouvé cet article qui semble avoir la réponse en javascript natif.
Cinq modèles pour vous aider à apprivoiser asynchronis javascript.
Par défaut Javascript est asynchrone.
Donc tout ce que vous avez à faire, c'est de ne pas utiliser ces bibliothèques, vous pouvez, mais il y a des moyens simples pour résoudre ce problème. Dans ce code, j'ai envoyé l'e-mail, avec les données que vient de l'événement, mais si vous voulez, vous avez juste besoin d'ajouter plus de fonctions à l'intérieur des fonctions.
Ce qui est important, c'est l'endroit où votre contexte.done(); va, il va, à la fin de votre fonction Lambda. Vous avez besoin de le mettre dans le fin de la dernière fonction.