Maison interface Web js tutoriel Explication détaillée des fonctions de file d'attente JavaScript et de l'exécution asynchrone

Explication détaillée des fonctions de file d'attente JavaScript et de l'exécution asynchrone

Jun 28, 2017 pm 02:39 PM
javascript js 执行

Cet article présente principalement les informations pertinentes sur la fonction de file d'attente JavaScript et l'exécution asynchrone en détail. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

Modifier Remarque : j'ai vu un article similaire. fonction de file d'attente lors de l'examen du code JavaScript d'autres personnes, mais je ne l'ai pas bien compris. Il s'avère que c'est pour garantir que les fonctions sont appelées dans l'ordre. Après avoir lu cet article, j'ai découvert qu'il pouvait également être utilisé pour une exécution asynchrone, etc.

Supposons que vous ayez plusieurs fonctions fn1, fn2 et fn3 qui doivent être appelées dans l'ordre. La manière la plus simple est bien sûr :


fn1();
fn2();
fn3();
Copier après la connexion
<. 🎜>


Mais parfois, ces fonctions sont ajoutées une par une pendant l'exécution, et vous ne savez pas quelles fonctions sont là lorsque vous les appelez à ce moment-là, vous pouvez prédéfinir un tableau et insérez la fonction lors de l'ajout de la fonction. , retirez-les une par une du tableau dans l'ordre si nécessaire et appelez-les dans l'ordre :



var stack = [];
// 执行其他操作,定义fn1
stack.push(fn1);
// 执行其他操作,定义fn2、fn3
stack.push(fn2, fn3);
// 调用的时候
stack.forEach(function(fn) { fn() });
Copier après la connexion


Cette fonction a peu importe si elle n'a pas de nom. Vous pouvez simplement passer la

fonction anonyme directement. Testons-le :


var stack = [];
function fn1() {
  console.log(&#39;第一个调用&#39;);
}
stack.push(fn1);

function fn2() {
  console.log(&#39;第二个调用&#39;);
}
stack.push(fn2, function() { console.log(&#39;第三个调用&#39;) });

stack.forEach(function(fn) { fn() }); // 按顺序输出&#39;第一个调用&#39;、&#39;第二个调用&#39;、&#39;第三个调用&#39;
Copier après la connexion


Cette implémentation fonctionne bien jusqu'à présent, mais nous avons ignoré une situation, qui est appel de fonction asynchrone. L'asynchronie est un sujet incontournable en JavaScript. Je ne vais pas aborder ici les différents termes et concepts liés à l'asynchrone en JavaScript. Les lecteurs sont invités à le vérifier par eux-mêmes (comme un commentaire célèbre). Si vous savez que le code suivant affichera 1, 3 et 2, continuez à lire :



console.log(1);

setTimeout(function() {
  console.log(2);
}, 0);

console.log(3);
Copier après la connexion


S'il y a une fonction dans la file d'attente de la pile qui est une fonction asynchrone similaire, notre implémentation sera gâchée :



var stack = [];

function fn1() { console.log(&#39;第一个调用&#39;) };
stack.push(fn1);

function fn2() {
  setTimeout(function fn2Timeout() {
     console.log(&#39;第二个调用&#39;);
  }, 0);
}
stack.push(fn2, function() { console.log(&#39;第三个调用&#39;) });

stack.forEach(function(fn) { fn() }); // 输出&#39;第一个调用&#39;、&#39;第三个调用&#39;、&#39;第二个调用&#39;
Copier après la connexion


Le problème est évident, fn2 est bien appelé dans l'ordre, mais la fonction fn2Timeout() { console.log('second call') } dans setTimeout n'est pas exécutée immédiatement (même si le timeout est mis à 0 après) ; fn2 est appelé Return immédiatement, puis exécute fn3. Une fois fn3 exécuté, c'est vraiment le tour de fn2Timeout.


Comment le résoudre ? Analysons-le. La clé ici est fn2Timeout. Nous devons attendre qu'il soit réellement exécuté avant d'appeler fn3. Idéalement, cela ressemble à ceci :



function fn2() {
  setTimeout(function() {
    fn2Timeout();
    fn3();
  }, 0);
}
Copier après la connexion
.


Mais faire cela équivaut à supprimer le fn2Timeout d'origine et à le remplacer par une nouvelle fonction, puis à insérer les fn2Timeout et fn3 d'origine. Cette méthode de modification dynamique de la fonction d'origine porte un terme spécial appelé Monkey Patch. Selon le mantra de nos programmeurs : "Cela peut certainement être fait", mais c'est un peu délicat à écrire, et il est facile de s'impliquer. Existe-t-il une meilleure façon ?

Nous prenons du recul et n'insistons pas pour attendre que fn2Timeout soit complètement exécuté avant d'exécuter fn3. Nous l'appelons plutôt sur la dernière ligne du corps de la fonction fn2Timeout :

<🎜. >


function fn2() {
  setTimeout(function fn2Timeout() {
    console.log(&#39;第二个调用&#39;);
    fn3();    // 注{1}
  }, 0);
}
Copier après la connexion


Cela semble mieux, mais lorsque fn2 a été défini, il n'y avait pas encore de fn3. D'où vient fn3 ?

Il y a un autre problème. Puisque fn3 doit être appelé dans fn2, nous ne pouvons pas appeler fn3 via stack.forEach, sinon fn3 sera appelé deux fois.

Nous ne pouvons pas écrire fn3 dans fn2. Au lieu de cela, il nous suffit de trouver la fonction suivante de fn2 dans la pile à la fin de fn2Timeout, puis d'appeler :



function fn2() {
  setTimeout(function fn2Timeout() {
    console.log(&#39;第二个调用&#39;);
    next();
  }, 0);
}
Copier après la connexion


Cette fonction suivante est chargée de trouver la fonction suivante dans la pile et de l'exécuter. Implémentons ensuite maintenant :



var index = 0;

function next() {
  var fn = stack[index];
  index = index + 1; // 其实也可以用shift 把fn 拿出来
  if (typeof fn === &#39;function&#39;) fn();
}
Copier après la connexion


next utilise stack[index] pour obtenir les fonctions dans la pile Calling. la prochaine fois augmentera l'indice de 1, atteignant ainsi l'objectif de supprimer la fonction suivante.

next est utilisé comme ceci :




var stack = [];

// 定义index 和next

function fn1() {
  console.log(&#39;第一个调用&#39;);
  next(); // stack 中每一个函数都必须调用`next`
};
stack.push(fn1);

function fn2() {
  setTimeout(function fn2Timeout() {
     console.log(&#39;第二个调用&#39;);
     next(); // 调用`next`
  }, 0);
}
stack.push(fn2, function() {
  console.log(&#39;第三个调用&#39;);
  next(); // 最后一个可以不调用,调用也没用。
});

next(); // 调用next,最终按顺序输出&#39;第一个调用&#39;、&#39;第二个调用&#39;、&#39;第三个调用&#39;。
Copier après la connexion


Maintenant, la ligne stack.forEach a été supprimée, nous appelons-le nous-mêmes Une fois ensuite, next trouvera la première fonction fn1 dans la pile à exécuter, appellera next dans fn1 pour trouver la fonction suivante fn2 et l'exécutera, puis appellera next dans fn2, et ainsi de suite.

Chaque fonction doit appeler next. Si elle n'est pas écrite dans une certaine fonction, le programme se terminera directement après l'exécution de la fonction sans aucun mécanisme pour continuer.


Après avoir compris cette implémentation de la file d'attente des fonctions, vous devriez être capable de résoudre la question d'entretien suivante :



// 实现一个LazyMan,可以按照以下方式调用:
LazyMan(“Hank”)
/* 输出: 
Hi! This is Hank!
*/

LazyMan(“Hank”).sleep(10).eat(“dinner”)输出
/* 输出: 
Hi! This is Hank!
// 等待10秒..
Wake up after 10
Eat dinner~
*/

LazyMan(“Hank”).eat(“dinner”).eat(“supper”)
/* 输出: 
Hi This is Hank!
Eat dinner~
Eat supper~
*/

LazyMan(“Hank”).sleepFirst(5).eat(“supper”)
/* 等待5秒,输出
Wake up after 5
Hi This is Hank!
Eat supper
*/

// 以此类推。
Copier après la connexion


Node.js

C'est ainsi que le célèbre connectframework implémente la file d'attente middleware. Si vous êtes intéressé, vous pouvez jeter un oeil à son code source ou à cette explication "Qu'est-ce que le middleware de connexion".
Si vous faites attention, vous verrez peut-être que ce next ne peut être placé qu'à la fin de la fonction pour le moment. S'il est placé au milieu, le problème d'origine se produira toujours :



function fn() {
  console.log(1);
  next();
  console.log(2); // next()如果调用了异步函数,console.log(2)就会先执行
}
Copier après la connexion


Grâce à différentes implémentations, redux et koa peuvent se placer ensuite au milieu de la fonction. fonction suivante, il peut ensuite être rétabli pour exécuter ensuite le code ci-dessous. Écrivez à nouveau quand vous aurez le temps.


Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. J'espère également que tout le monde soutiendra Script House.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Dec 17, 2023 pm 06:55 PM

Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies en PHP et JS. Des exemples de code spécifiques sont nécessaires. Avec le développement rapide d'Internet et de la technologie, le trading d'actions est devenu l'un des moyens importants pour de nombreux investisseurs. L'analyse boursière est une partie importante de la prise de décision des investisseurs, et les graphiques en bougies sont largement utilisés dans l'analyse technique. Apprendre à dessiner des graphiques en bougies à l'aide de PHP et JS fournira aux investisseurs des informations plus intuitives pour les aider à prendre de meilleures décisions. Un graphique en chandeliers est un graphique technique qui affiche les cours des actions sous forme de chandeliers. Il montre le cours de l'action

Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Apr 03, 2024 am 11:55 AM

La technologie de détection et de reconnaissance des visages est déjà une technologie relativement mature et largement utilisée. Actuellement, le langage d'application Internet le plus utilisé est JS. La mise en œuvre de la détection et de la reconnaissance faciale sur le front-end Web présente des avantages et des inconvénients par rapport à la reconnaissance faciale back-end. Les avantages incluent la réduction de l'interaction réseau et de la reconnaissance en temps réel, ce qui réduit considérablement le temps d'attente des utilisateurs et améliore l'expérience utilisateur. Les inconvénients sont les suivants : il est limité par la taille du modèle et la précision est également limitée ; Comment utiliser js pour implémenter la détection de visage sur le web ? Afin de mettre en œuvre la reconnaissance faciale sur le Web, vous devez être familier avec les langages et technologies de programmation associés, tels que JavaScript, HTML, CSS, WebRTC, etc. Dans le même temps, vous devez également maîtriser les technologies pertinentes de vision par ordinateur et d’intelligence artificielle. Il convient de noter qu'en raison de la conception du côté Web

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Dec 18, 2023 pm 03:39 PM

Avec le développement rapide de la finance sur Internet, l'investissement en actions est devenu le choix de plus en plus de personnes. Dans le trading d'actions, les graphiques en bougies sont une méthode d'analyse technique couramment utilisée. Ils peuvent montrer l'évolution des cours des actions et aider les investisseurs à prendre des décisions plus précises. Cet article présentera les compétences de développement de PHP et JS, amènera les lecteurs à comprendre comment dessiner des graphiques en bougies boursières et fournira des exemples de code spécifiques. 1. Comprendre les graphiques en bougies boursières Avant de présenter comment dessiner des graphiques en bougies boursières, nous devons d'abord comprendre ce qu'est un graphique en bougies. Les graphiques en chandeliers ont été développés par les Japonais

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

La relation entre js et vue La relation entre js et vue Mar 11, 2024 pm 05:21 PM

La relation entre js et vue : 1. JS comme pierre angulaire du développement Web ; 2. L'essor de Vue.js en tant que framework front-end ; 3. La relation complémentaire entre JS et Vue ; Vue.

See all articles