J'ai essayé de rechercher comment exactement les fonctions asynchrones devraient être écrites. Après avoir parcouru beaucoup de documents, je ne sais toujours pas.
Comment écrire des fonctions asynchrones pour Node? Comment dois-je implémenter correctement la gestion des événements d'erreur?
Une autre façon de poser ma question serait la suivante: Comment dois-je interpréter la fonction suivante?
var async_function = function(val, callback){
process.nextTick(function(){
callback(val);
});
};
Aussi, j'ai trouvé cette question sur SO ("Comment créer une fonction asynchrone non bloquante dans node.js?") Intéressante. Je n'ai pas encore l'impression d'avoir répondu.
setTimeout
etsetInterval
dans votre navigateur préféré et de jouer avec eux également. Ou des rappels ajax (probablement la chose la plus proche de l'expérience du nœud), ou des écouteurs d'événements pour des choses que vous connaissez bien, comme les événements de clic et de chargement. Le modèle asynchrone existe déjà dans le navigateur et ils sont exactement les mêmes dans node.Réponses:
Vous semblez confondre les E / S asynchrones avec les fonctions asynchrones. node.js utilise des E / S non bloquantes asynchrones car les E / S non bloquantes sont meilleures. La meilleure façon de le comprendre est d'aller regarder quelques vidéos de Ryan Dahl.
Ecrivez simplement des fonctions normales, la seule différence est qu'elles ne sont pas exécutées immédiatement mais transmises en tant que rappels.
Généralement, les API vous donnent un rappel avec une erreur comme premier argument. Par exemple
Est un modèle courant.
Un autre modèle courant est
on('error')
. Par exempleÉditer:
La fonction ci-dessus lorsqu'elle est appelée comme
Imprime
42
sur la console de manière asynchrone. En particulier, seprocess.nextTick
déclenche après que la pile d'appels eventloop actuelle est vide. Cette pile d'appels est vide aprèsasync_function
etconsole.log(43)
été exécutée. Nous imprimons donc 43 suivis de 42.Vous devriez probablement faire un peu de lecture sur la boucle d'événements.
la source
Le simple fait de passer par des rappels ne suffit pas. Vous devez utiliser settimer par exemple pour rendre la fonction asynchrone.
Exemples: fonctions non asynchrones:
Si vous exécutez l'exemple ci-dessus, cela devrait être bon, vous devrez attendre que ces fonctions finissent de fonctionner.
Fonctions pseudo multithread (async):
Celui-ci sera vraiment asynchrone. Cela devrait être bon sera écrit avant la fin de l'async.
la source
Vous devriez regarder ceci: Node Tuts épisode 19 - Modèles d'itération asynchrone
Cela devrait répondre à vos questions.
la source
Si vous SAVEZ qu'une fonction renvoie une promesse, je suggère d'utiliser les nouvelles fonctionnalités async / await de JavaScript. Cela rend la syntaxe synchrone mais fonctionne de manière asynchrone. Lorsque vous ajoutez le
async
mot - clé à une fonction, cela vous permet de faire desawait
promesses dans cette portée:si une fonction ne renvoie pas de promesse, je recommande de l'envelopper dans une nouvelle promesse que vous définissez, puis de résoudre les données que vous souhaitez:
En bout de ligne: tirez parti de la puissance des promesses.
la source
Essayez ceci, cela fonctionne à la fois pour le nœud et le navigateur.
la source
J'ai traité trop d'heures pour une telle tâche pour node.js. Je suis principalement un gars du front-end.
Je trouve cela assez important, car toutes les méthodes de nœuds asynchrones traitent le rappel, et le transformer en Promise est préférable de le gérer.
Je veux juste montrer un résultat possible, plus mince et plus lisible. En utilisant ECMA-6 avec async, vous pouvez l'écrire comme ceci.
les scénarios
(undefined || null)
sont pour repl (lecture de la boucle d'impression d'événement), en utilisant également undefined.la source