Ce que cet article vous apporte, c'est le concept de mécanisme d'exécution js ? La méthode d'implémentation du mécanisme d'exécution js a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer, j'espère qu'elle vous sera utile.
Dans le développement réel, une fois la requête terminée, vous souhaitez toujours attribuer les données obtenues par la requête à un certain objet ou variable si la valeur n'est pas attribuée dans la fonction de rappel de la requête, mais attribuée. sous l'instruction de requête, nous constaterons que les données obtenues par la requête sont normales, mais que la variable après affectation n'est pas définie. Pourquoi est-ce ?
Tout d'abord, nous devons comprendre un concept qui est synchronisation et asynchrone. Comme nous le savons tous, js est un langage monothread, c'est-à-dire que js ne peut exécuter qu'une seule tâche à la fois. S'il y a plusieurs tâches, elles seront exécutées dans l'ordre des tâches. Mais si l'une des tâches prend beaucoup de temps, comme tomber dans une boucle infinie, alors les autres tâches ne peuvent pas être exécutées, ce qui empêche le navigateur de répondre. Alors, comment js le résout-il ? Il s'agit de diviser les tâches en modes d'exécution synchrone et asynchrone. La synchronisation est comme ci-dessus, et asynchrone signifie qu'il y a plus d'une fonction de rappel. Lorsque la tâche se termine, elle n'exécute pas la tâche suivante mais la fonction de rappel. Certaines personnes peuvent donc se demander quelle est la différence entre faire cela et la synchronisation. ? La différence est que cette dernière tâche n’a pas besoin d’attendre que la tâche précédente soit complètement exécutée avant de l’exécuter. Par conséquent, l’ordre d’exécution du programme que nous obtenons n’est pas l’ordre des tâches.
setTimeout(function(){ console.log('第一个延时调用'); }); console.log('哈哈哈'); new Promise(function(resolve){ console.log('promise任务吗'); resolve(); }).then(function(){ console.log('回调函数???') }); console.log('嘻嘻嘻'); setTimeout(function(){ console.log('第二个延时调用'); });
Quel est le résultat de l'exécution ?
Hahaha
Tâche de promesse
Heeheehee
Fonction de rappel ? ? ?
Le premier appel différé
Le deuxième appel différé
Pourquoi est-ce ? Pourquoi setTimeout est-il exécuté à la fin ? C'est évidemment 0 ms.
est dû au fait qu'en plus des modes synchrone et asynchrone, nous avons divisé les tâches en macro-tâches et micro-tâches .
Macro-tâche : y compris le script de code global, setTimeout, setInterval
Micro-tâche : Promise, process.nextTick
Lors de l'exécution, après avoir entré la macro-tâche, démarrez la première boucle, puis exécutez toutes les micro-tâches, et puis exécution du cycle suivant de la tâche macro.
Dans le code ci-dessus, entrez la tâche macro, enregistrez setTimeout comme tâche macro et placez-la dans la file d'attente, puis exécutez Hahaha. Lorsque vous rencontrez une nouvelle promesse, exécutez-la directement. La fonction de rappel place la file d'attente des microtâches, puis exécutez-la. exécute hehehe. Le deuxième A setTimeout est comme ci-dessus. Ensuite, exécutez la micro-tâche, il n'y a que hi hi hi ici. Entrez enfin la tâche macro suivante.
Recommandations associées :
Explication détaillée des exemples de mécanismes d'exécution js
Une brève analyse du mécanisme d'exécution JS
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!