Est-ce que console.log() est asynchrone ou synchrone ?
P粉248602298
2023-08-27 22:31:53
<p>Je lis actuellement "Async Javascript" de Trevor Burnham. C'est un excellent livre jusqu'à présent. </p>
<p>Il parle de cet extrait et de console.log comme étant "asynchrones" dans les consoles Safari et Chrome. Malheureusement, je ne peux pas reproduire cela. Voici le code : </p>
<pre class="brush:php;toolbar:false;">var obj = {};
console.log(obj);
obj.foo = 'bar';
// mon résultat : Object{}; 'bar';
// Le résultat du livre : {foo:bar};</pre>
<p>Si cela était asynchrone, je m'attendrais à ce que les résultats soient ceux qu'ils sont dans le livre. console.log() est placé dans la file d'attente des événements jusqu'à ce que tout le code ait été exécuté, puis il est exécuté et possède l'attribut bar. </p>
<p>On dirait qu'il fonctionne de manière synchrone. </p>
<p>Est-ce que je me trompe en exécutant ce code ? Est-ce que console.log est réellement asynchrone ? </p>
Ce n’est pas vraiment la réponse à la question, mais cela pourrait être utile à tous ceux qui tombent par hasard sur ce post et dont le commentaire est trop long :
Cela créera une version pseudo-synchrone de
console.log
mais avec les mêmes mises en garde que celles mentionnées dans la réponse acceptée.Comme il semble que la plupart des navigateurs de nos jours
console.log
soient asynchrones d'une manière ou d'une autre, vous souhaiterez peut-être utiliser une fonction comme celle-ci dans certains cas.console.log
Il n'y a pas de standardisation donc le comportement est plutôt indéfini et peut facilement changer entre les différentes versions des outils de développement. Votre livre est peut-être obsolète et mes réponses pourraient bientôt être obsolètes.Pour notre code, cela ne fait aucune différence que console.log soit asynchrone ou non, il ne fournit aucun type de rappel, etc. et la valeur que vous transmettez est toujours référencée et évaluée lorsque vous appelez la fonction.
Nous ne savons vraiment pas ce qui va se passer ensuite (enfin, nous le pouvons, puisque Firebug, Chrome Devtools et Opera Dragonfly sont tous open source). La console doit stocker les valeurs enregistrées quelque part et les afficher à l'écran. Le rendu se produira certainement de manière asynchrone (sous réserve de mises à jour limitées), tout comme les futures interactions avec les objets enregistrés dans la console (telles que l'extension des propriétés des objets).
Ainsi, la console peut cloner (sérialiser) vos objets mutables enregistrés, ou elle stockera des références à ceux-ci. Le premier ne fonctionne pas avec des objets profonds/grands. De plus, au moins le rendu initial dans la console peut afficher l'état "actuel" de l'objet, c'est-à-dire l'état au moment de l'enregistrement - dans votre exemple, vous voyez
Object {}
.Cependant, lorsque vous développez l'objet pour inspecter davantage ses propriétés, la console ne peut stocker que des références à l'objet et à ses propriétés, les afficher maintenant affichera son état actuel (muté). Si vous cliquez sur l'attribut
+
,您应该能够在示例中看到bar
.Voici une capture d'écran publiée dans un rapport de bug expliquant leur « correctif » :
Par conséquent, certaines valeurs peuvent ne être référencées que longtemps après leur enregistrement, et l'évaluation de ces valeurs est plutôt paresseuse ("en cas de besoin"). L'exemple le plus célèbre de cette différence se trouve dans la question La console JavaScript de Chrome gère-t-elle l'évaluation paresseuse des tableaux ?
La solution de contournement consiste à garantir qu'un instantané sérialisé de l'objet est toujours enregistré, par exemple en effectuant console.log(JSON.stringify(obj)). Cependant, cela ne fonctionne que pour les objets non circulaires et assez petits. Voir aussi Comment changer le comportement par défaut de console.log dans Safari ? .
Une meilleure solution consiste à utiliser des points d'arrêt pour le débogage, où l'exécution s'arrête complètement et vous pouvez inspecter la valeur actuelle à chaque point. Utilisez la journalisation uniquement pour les données sérialisables et immuables.