J'ai ce code simple: mon attente est qu'il devrait imprimer: p> comme la fonction anonyme qui est exécutée est marqué async. p> Cependant, il imprime, même après plusieurs essais: p> peut-être quelqu'un s'il vous plaît expliquer pourquoi cela se produit? P> p>
5 Réponses :
Tout d'abord, vous appelez alors vous appelez Alors alors vous Les finitions de la vie en cours d'exécution, la fonction extérieure continue avec Ensuite, la fonction extérieure se termine, le microtask est donc tiré de la file d'attente et la fonction ASYNC se réveille. P>
La valeur résolue de la promesse est attribuée et voir Timing de MDN pour plus loin lecture. p> printhello () code>. p>
console.log ('Hello World') code> Quels journaux. P>
retour 5; code> qui résout la promesse. p>
const cinq = attendre ... code> 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. P>
console.log ("appdémie de l'application"); code> quelle application journal a commencé. P>
console.log (`cinq: $ {cinq}` `); code> le connecte. P>
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 code> 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 code> et vos amis qui font.
Je comparais toujours async code> La fonction renvoie une promesse mais le code synchrone intérieur
async code> est exécuté immédiatement (c'est-à-dire synchrone).
attendre code> instruction pause l'exécution de code jusqu'à la promesse qui est donnée est résolue ou rejetée. P>
async code> comportement de fonction avec la promesse code> code> 's
Executor code> param
comportement. exécutant code> est appelé immédiatement I.e. synchrone. P>
Votre code ne fait rien d'asynchrone. La méthode code> printhello code> exécute de manière synchrone.
Préfixer une fonction avec 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. p> async code> 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.
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.
Votre code n'est pas asynchrone. C'est ce problème. Vous devez retourner une promesse qui est toujours asynchrone.
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. P>
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. P>
Considérez cette application express: p> maintenant si vous accédez à: 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 ++. p> 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. p> p> http: // Localhost: 3000 / Nom / Tom Code> Tout d'abord, puis
http: // localhost: 3000 / nom / john code> 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 code> Il aura raccroché complet. P>
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.