Attendre des fonctions asynchrones jusqu'à la fin sans l'ajout de rappel
Je suis en train d'écrire des tests pour mon Nœud.js/Express/Mangouste projet à l'aide de Moka et de Should.js et je suis en essais de mes fonctions que l'accès à mon MongoDB. Je veux que ces tests soient complètement indépendants de la réalité des enregistrements dans ma base de données, donc je veux créer une entrée puis de la charger, et de faire tous mes tests sur elle, puis le supprimer. J'ai mes fonctions de l'écrit (je suis en train d'écrire des tests après que le projet est terminé) tels que le create
fonction n'a pas de rappel; il rend une page quand c'est fait. Dans mes tests, script, je l'appelle mon load_entry
fonction après j'appelle create
, mais parfois create
prend plus de temps que d'habitude et donc load_entry
déclenche une erreur lorsqu'il est impossible de charger l'article car il n'a pas encore créé. Est-il une manière de s'assurer une fonction d'asynchrone est terminée, sans l'aide de rappels?
S'il vous plaît laissez-moi savoir si il y a plus d'info je peux fournir. J'ai cherché partout sur Google et je ne pouvais pas trouver quelque chose qui a vraiment répondu à ma question, puisque la plupart des solutions de simplement dire "utiliser un rappel!"
OriginalL'auteur gr3co | 2013-08-09
Vous devez vous connecter pour publier un commentaire.
Utiliser ce qui est connu comme une
promise
Vous pouvez en lire plus à ce sujet ici.
Il y a beaucoup de bibliothèques qui peuvent le faire pour vous.
Q. js est un personnellement, je l'aime et il est largement utilisé de nos jours. Promesses existent également dans jQuery parmi beaucoup d'autres.
Voici un exemple d'utilisation d'un q promesse avec asynchrone
json-p
appel: DÉMOSonne bien, content que tu ai une solution qui fonctionne! Je vous recommande vivement de prendre un coup d'oeil à des promesses, peu importe. Les promesses sont un excellent modèle.
OriginalL'auteur Eric Hotinger
C'est certainement le genre de chose que vous souhaitez un rappel pour. Sauf que, vous allez avoir à écrire une sorte de rappel wrapper qui interroge la base de données afin de déterminer quand il a fini de créer les dossiers pertinents, puis émet un événement ou d'une autre async chose pour permettre le test de continuer.
OriginalL'auteur lmjohns3
Depuis le seul natif de façon à ne asynchrone choses sont:
setTimeout
,setInterval
etaddEventListener
, et ils prennent tous un rappel vous finirez par avoir à utiliser un rappel de quelque part.Cependant, vous pouvez vous cacher qu'en utilisant des Promesses/A, aussi connu comme Deferreds.
Votre code pourrait ressembler à ceci:
À l'aide de puis-chaîne:
OriginalL'auteur Halcyon
J'ai trouvé une solution qui fonctionne. Ce que j'ai fait a été d'ajouter un rappel à ma fonction (
next
) et seulement l'appeler si il est spécifié (c'est à dire, pour les tests):De cette façon, quand je lance le serveur et pas de rappel est spécifié, il ne va pas faire une erreur, car il vous suffit de nous renvoyer le
res.render
déclaration.OriginalL'auteur gr3co