-1
votes

ASYNC Fonction ne se comporte pas comme prévu dans Nodejs

J'ai ce code simple: xxx

mon attente est qu'il devrait imprimer: xxx

comme la fonction anonyme qui est exécutée est marqué async.

Cependant, il imprime, même après plusieurs essais: xxx

peut-être quelqu'un s'il vous plaît expliquer pourquoi cela se produit?


2 commentaires

C'est probablement parce que le code est exécuté de haut en bas, d'où le message "Hello World" est affiché avant que "l'application démarre".


@Edric Yeah mais quand vous le marquez comme ASYNC, l'appel va à la ligne suivante et ASYNC Funct est exécuté lors de la prochaine ticelle de la boucle d'événement.


5 Réponses :


5
votes

Tout d'abord, vous appelez printhello () .

alors vous appelez console.log ('Hello World') Quels journaux.

Alors retour 5; qui résout la promesse.

alors vous const cinq = attendre ... qui attend la promesse renvoyée ci-dessus. Ceci est un MicroTASK de sorte qu'il soit mis en file d'attente et la fonction Async se couche.

Les finitions de la vie en cours d'exécution, la fonction extérieure continue avec console.log ("appdémie de l'application"); quelle application journal a commencé.

Ensuite, la fonction extérieure se termine, le microtask est donc tiré de la file d'attente et la fonction ASYNC se réveille.

La valeur résolue de la promesse est attribuée et console.log (`cinq: $ {cinq}` `); le connecte.

voir Timing de MDN pour plus loin lecture.


3 commentaires

Qu'en est-il de l'ASYNC sur la fonction anonyme immédiatement exécutée? Il devrait créer microtask et être mis en file d'attente pour la prochaine tique. 'App a commencé' est pour la coche actuelle.


La promesse dans sa forme pure se comporterait comme ça, mais async la fonction pause tout. Donc, la dernière ligne attend que NIHE se termine.


@ user3769778 - Appeler une fonction ASYNC ne crée pas de mastick. C'est alors et vos amis qui font.



1
votes

async La fonction renvoie une promesse mais le code synchrone intérieur async est exécuté immédiatement (c'est-à-dire synchrone). attendre instruction pause l'exécution de code jusqu'à la promesse qui est donnée est résolue ou rejetée.

Je comparais toujours async comportement de fonction avec la promesse 's Executor param comportement. exécutant est appelé immédiatement I.e. synchrone.


0 commentaires

1
votes

Votre code ne fait rien d'asynchrone. La méthode printhello exécute de manière synchrone. Préfixer une fonction avec async Assurez-vous qu'il retourne une promesse. Vous pouvez le remplacer par rappel et fonctionnera de la même manière, car le rappel reviendra immédiatement sans attendre la prochaine ticelle de la boucle d'événement.

Donc, si votre code se comporte de la façon dont vous voulez, alors vous voulez devra envelopper avec un appel de sécurité ou Setimmediate. xxx


3 commentaires

Si j'avais un très gros calcul dans Printhello et je voulais qu'il ne raccroche pas ma boucle d'événement, les options que je dois en faire Async? Je pensais marquer n'importe quelle fonction Async le fera d'ASYNC et le passage ira à la ligne suivante.


Enroulez-le à l'intérieur de Setimmediate ou de Process.Nexttick, il semblera d'apparaître asynchrone et ne bloquera pas immédiatement l'exécution. Mais le faire en enfants sera une meilleure idée ( Nodejs.org/api/child_process.htmlled/a >)


Bien que le code ne fasse rien d'asynchrone, il se comporte toujours de manière asynchrone comme des promesses (aussi que celles retournées des fonctions asynchrones) garantissent une résolution asynchrone. Et vous avez raison, le déchargement à un autre processus semble être la bonne approche ici.



1
votes

Votre code n'est pas asynchrone. C'est ce problème. Vous devez retourner une promesse qui est toujours asynchrone. xxx


0 commentaires

0
votes

Tous les gars ont donné beaucoup de réponses utiles, mais je devrai écrire une réponse pour aider les personnes qui proposent une mentalité similaire à celle de moi: simplement en marquant une fonction async [ou l'enveloppant en promesse] ne fera pas Votre code intensif de la CPU pour fonctionner en tant que conduite asynchrone dans Nodejs.

Ma compréhension avant ce problème, était-ce que nous ne pouvons simplement mettre ASYNC avant une fonction et mettre toute une tâche difficile à ce sujet. AYSNC va quelque chose que laisse la boucle d'événement Nodejs savoir une fois sa finition [retournée]. Et j'utilise pour penser que tout cela sous la cagoule via des filets de frai.

Mais cette compréhension est incorrecte. Le nœud est un seul fileté, si vous allez écrire votre code. Ne jamais mettre autre chose de tâche lourde sur Nodejs.

Considérez cette application express: xxx

maintenant si vous accédez à: http: // Localhost: 3000 / Nom / Tom Tout d'abord, puis http: // localhost: 3000 / nom / john Dans votre navigateur, M.John devra attendre au total 12 secondes minimum. Celles-ci sont parce que le nœud JS est un seul fileté, peu importe que vous utilisez ASYNC ou une promesse d'envelopper votre Timeconsumingfunct Il aura raccroché complet.

Le seul moyen de le rendre véritablement async être d'utiliser une API de processus d'enfant ou de travailleur ou de l'écrire en C ++.

Tout ce que vous écrivez comme une JS est toujours synchrone et que cela va raccrocher toutes les demandes, sachez que avant de penser que vous ne pouvez plus faire AYSNC en nœudjs.


0 commentaires