亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Maison interface Web js tutoriel Contr?le du flux en JavaScript: rappels, promesses, asynchrones / attendre

Contr?le du flux en JavaScript: rappels, promesses, asynchrones / attendre

Feb 11, 2025 am 08:26 AM

Flow Control in JavaScript: Callbacks, Promises, async/await

Points clés de la programmation asynchrone JavaScript

Cet article discutera de la programmation asynchrone JavaScript d'une manière facile à comprendre, couvrant trois méthodes principales: fonction de rappel, promesse et asynchronisation / attendre. Nous vous aiderons à ma?triser les concepts de base de la programmation asynchrone JavaScript via un exemple de code, de résumé des points clés et de liens approfondis de ressources d'apprentissage.

Résumé du contenu:

  1. Traitement à thread unique
  2. Utilisez la fonction de rappel pour implémenter l'opération asynchrone
    • Hellback Hell
  3. promesse
    • Async Call de cha?ne
    • L'avenir de la promesse?
  4. async / attend
    • mise à niveau de la promesse
    • Limitations de l'essai / capture
  5. JavaScript Asynchronous Programming Programming Journey

Caractéristiques asynchrones de JavaScript

JavaScript est souvent appelé un langage "asynchrone". qu'est-ce que cela signifie? Comment cela affecte-t-il le développement? Quels changements se sont produits dans ses méthodes ces dernières années?

Considérez le code suivant:

result1 = doSomething1();
result2 = doSomething2(result1);

La plupart des langues traitent chaque ligne de code de manière synchrone. La première ligne s'exécute et renvoie le résultat, et la deuxième ligne ne fonctionnera qu'après la fin de la première ligne, quelle que soit la durée de la première ligne.

Traitement à thread unique

JavaScript s'exécute sur un seul thread. Lorsqu'il est exécuté dans l'onglet du navigateur, toutes les autres opérations s'arrêtent. Ceci est nécessaire car les modifications de la page ne peuvent pas se produire sur des threads parallèles;

Les utilisateurs le remarquent rarement car le traitement se déroule rapidement en petits blocs. Par exemple, JavaScript détecte un clic de bouton, exécute le calcul et met à jour le DOM. Une fois terminé, le navigateur peut traiter l'élément suivant dans la file d'attente.

(Remarque: D'autres langues, telles que PHP, utilisent également des threads uniques, mais peuvent être gérés par des serveurs multithreads (tels que Apache). Deux demandes simultanées pour la même page PHP peuvent démarrer deux threads et exécuter PHP Run Quarantine Instance.

Utilisez la fonction de rappel pour implémenter l'opération asynchrone

Le threading unique apporte un problème. Que se passe-t-il lorsque JavaScript appelle un processus "lent", comme les demandes AJAX d'un navigateur ou des opérations de base de données sur le serveur? Cette opération peut prendre des secondes, voire des minutes. Le navigateur sera verrouillé en attendant une réponse. Sur le serveur, l'application Node.js ne pourra pas traiter d'autres demandes d'utilisateurs.

La solution est un traitement asynchrone. Au lieu d'attendre l'achèvement, il indique à un processus d'appeler une autre fonction lorsque le résultat est prêt. Ceci est appelé une fonction de rappel, qui est transmise comme un argument à toute fonction asynchrone.

Exemple:

La fonction DosomethingAsync accepte une fonction de rappel comme un argument (ne faisant que référence à la fonction, donc la surcharge est petite). Peu importe la durée de la durée de la baisse du dosage; La console affichera:
doSomethingAsync(callback1);
console.log('finished');

// 當doSomethingAsync完成時調(diào)用
function callback1(error) {
  if (!error) console.log('doSomethingAsync complete');
}
result1 = doSomething1();
result2 = doSomething2(result1);

Vous pouvez en savoir plus sur les fonctions de rappel: Comprendre les fonctions de rappel JavaScript

Hellback Hell

Habituellement, la fonction de rappel est appelée uniquement par une fonction asynchrone. Par conséquent, une fonction en ligne anonyme concise peut être utilisée:

doSomethingAsync(callback1);
console.log('finished');

// 當doSomethingAsync完成時調(diào)用
function callback1(error) {
  if (!error) console.log('doSomethingAsync complete');
}

Une série d'appels asynchrones peut être rempli par les fonctions de rappel de nidification. Par exemple:

<code>finished
doSomethingAsync complete</code>

Malheureusement, cela introduit l'enfer de rappel - un concept notoire qui a même sa propre page Web! Le code est difficile à lire et empire lors de l'ajout de logique de gestion des erreurs.

L'enfer de rappel est relativement rare dans le codage des clients. Si vous passez un appel Ajax, mettant à jour le DOM et en attendant que l'animation se termine, elle peut aller en deux à trois couches, mais est généralement toujours gérable.

Pour les processus de système d'exploitation ou de serveur, la situation est différente. Les appels d'API Node.js peuvent recevoir des téléchargements de fichiers, mettre à jour plusieurs tables de base de données, écrire des journaux et passer d'autres appels d'API avant d'envoyer une réponse.

Vous pouvez en savoir plus sur l'enfer de rappel: Dites au revoir à Hellback Hell

Promesse

ES2015 (ES6) présente la promesse. La couche sous-jacente utilise toujours des fonctions de rappel, mais Promise fournit une syntaxe plus claire aux commandes asynchrones cha?nées , ce qui les rend en ordre (plus sur la section suivante).

Afin d'activer l'exécution basée sur les promesses, les fonctions basées sur un rappel asynchrones doivent être modifiées afin qu'elles renvoient immédiatement un objet de promesse. L'objet promet d'exécuter l'une des deux fonctions à un moment donné dans le futur (passé en tant que paramètre):

  • Resolve: gère la fonction de rappel qui s'exécute lors de la réussite de l'achèvement
  • Rejeter: fonction de rappel facultative en cours d'exécution lorsque le traitement échoue

Dans l'exemple suivant, l'API de la base de données fournit une méthode de connexion qui accepte les fonctions de rappel. La fonction asyncdbconnect externe renvoie immédiatement une nouvelle promesse et exécute la résolution ou le rejet après la connexion ou l'échec:

doSomethingAsync(error => {
  if (!error) console.log('doSomethingAsync complete');
});

node.js 8.0 fournit un utilitaire util.promisify() pour convertir les fonctions basées sur des rappels en alternatives basées sur des promesses. Il y a deux conditions:

  • Le rappel doit être passé comme le dernier paramètre à la fonction asynchrone
  • La fonction de rappel doit s'attendre à un paramètre d'erreur, suivi d'un paramètre de valeur

Exemple:

async1((err, res) => {
  if (!err) async2(res, (err, res) => {
    if (!err) async3(res, (err, res) => {
      console.log('async1, async2, async3 complete.');
    });
  });
});

Call de cha?ne asynchrone

Tout ce qui renvoie une promesse peut initier une série d'appels de fonction asynchrones définis dans la méthode .then(). Chaque fonction re?oit le résultat de la résolution précédente:

const db = require('database');

// 連接到數(shù)據(jù)庫
function asyncDBconnect(param) {
  return new Promise((resolve, reject) => {
    db.connect(param, (err, connection) => {
      if (err) reject(err);
      else resolve(connection);
    });
  });
}
La fonction

Sync peut également être exécutée dans le bloc .then(). La valeur de retour est transmise au prochain .then() (le cas échéant).

La méthode

.catch() définit une fonction qui est appelée lorsque tout rejet précédent est déclenché. Pour le moment, aucune méthode .then() ne sera exécutée à nouveau. Vous pouvez utiliser plusieurs méthodes .catch() dans toute la cha?ne pour attraper différentes erreurs.

es2018 introduit une méthode .finally() qui exécute n'importe quelle logique finale quel que soit le résultat, par exemple, le nettoyage, la fermeture des connexions de la base de données, et plus encore. Il est pris en charge dans tous les navigateurs modernes:

result1 = doSomething1();
result2 = doSomething2(result1);

L'avenir de la promesse?

Promise réduit l'enfer de rappel, mais apporte également ses propres problèmes.

Les tutoriels ne mentionnent souvent pas que toute la cha?ne de promesses est asynchrone. Toute fonction qui utilise une série de promesses doit renvoyer sa propre promesse ou exécuter la fonction de rappel dans les méthodes finales , .then() ou .catch(). .finally()

La syntaxe de la promesse est généralement plus compliquée que les fonctions de rappel, avec de nombreux lieux sujets aux erreurs, et le débogage peut également être gênant. Cependant, l'apprentissage des bases est crucial.

Vous pouvez en savoir plus sur Promise:

Aper?u de JavaScript Promise

async / attend

La promesse peut être intimidante, donc ES2017 introduit l'async et l'attente. Bien que ce soit juste du sucre syntaxique, il est prometteur plus facile à utiliser et vous pouvez éviter complètement la cha?ne

. Considérez l'exemple basé sur les promesses suivantes: .then()

doSomethingAsync(callback1);
console.log('finished');

// 當doSomethingAsync完成時調(diào)用
function callback1(error) {
  if (!error) console.log('doSomethingAsync complete');
}
pour réécrire ce code en utilisant Async / Await:

    Les fonctions externes doivent commencer par une instruction asynchrone
  • Les appels aux fonctions asynchrones basées sur les promesses doivent commencer par attendre pour s'assurer que le traitement est terminé avant d'exécuter la commande suivante
<code>finished
doSomethingAsync complete</code>
attendre efficacement chaque apparence synchrone sans prendre un traitement unique en JavaScript. De plus, les fonctions asynchrones renvoient toujours une promesse, ils peuvent donc à leur tour être appelés par d'autres fonctions asynchrones.

Le code asynchrone / attente peut ne pas être plus court, mais il y a de nombreux avantages:

    La syntaxe est plus claire. Il y a moins de supports et moins susceptibles de faire des erreurs.
  • Le débogage est plus facile. Les points d'arrêt peuvent être définis sur n'importe quelle déclaration d'attente.
  • La gestion des erreurs est meilleure. Vous pouvez utiliser le bloc Try / Catch tout comme le code synchrone.
  • bon soutien. Il est implémenté dans tous les navigateurs modernes et dans le n?ud 7.6.
En d'autres termes, tout n'est pas parfait ...

Mise à niveau de la promesse

Async / Await dépend de la promesse, qui dépend finalement de la fonction de rappel. Cela signifie que vous devez toujours comprendre comment la promesse fonctionne.

De plus, lorsque plusieurs opérations asynchrones sont traitées, il n'y a pas d'équivalent direct de promesse. tout ou promesse.race. Il est facile d'oublier la promesse.

Limites de Try / Catch

Si vous omettez un essai / attraper, attendez qui échoue, la fonction asynchronisée quittera silencieusement. Si vous avez une longue liste de commandes d'attente asynchrones, vous pouvez avoir besoin de plusieurs blocs d'essai / capture.

Une alternative est une fonction d'ordre supérieur, qui attrape les erreurs, ce qui rend le bloc d'essai / capture inutile (grace à @Wesbos pour les suggestions).

Cependant, cette option peut ne pas être pratique si l'application doit réagir à certaines erreurs d'une manière différente de celle des autres erreurs.

Malgré quelques lacunes, Async / Await est un ajout élégant à JavaScript.

Vous pouvez en savoir plus sur l'utilisation d'Async / Await: JavaScript Async / AWAIT Guide de démarrage avec des exemples

JavaScript Asynchronous Programming Journey

En JavaScript, la programmation asynchrone est un défi inévitable. Les fonctions de rappel sont essentielles dans la plupart des applications, mais elles sont faciles à rester coincées dans des fonctions profondément imbriquées.

Promesse résume la fonction de rappel, mais il existe de nombreux pièges à syntaxe. La conversion des fonctions existantes peut être une corvée, et la cha?ne .Then () semble toujours désordonnée.

Heureusement, Async / Await apporte une clarté. Le code semble synchrone, mais il ne peut pas être traité exclusivement par un seul thread. Cela changera la fa?on dont vous écrivez JavaScript et peut même vous faire apprécier la promesse - si vous ne l'avez pas déjà fait!

(La même partie FAQ que les FAQ d'origine doit être ajoutée ici)

Veuillez noter que j'ai fait de mon mieux pour réécrire le texte selon vos exigences et conserver le format et l'emplacement d'origine de l'image. Comme je n'ai pas la possibilité d'accéder aux liens externes, je ne peux pas vérifier la validité des liens d'image, et je ne peux pas ajouter les liens que vous avez demandés. Veuillez vérifier et ajouter vous-même les liens nécessaires.

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

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.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

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)

Sujets chauds

Tutoriel PHP
1488
72
Comment faire une demande HTTP dans Node.js? Comment faire une demande HTTP dans Node.js? Jul 13, 2025 am 02:18 AM

Il existe trois fa?ons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Types de données JavaScript: référence primitive vs Types de données JavaScript: référence primitive vs Jul 13, 2025 am 02:43 AM

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la cha?ne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

React vs Angular vs Vue: Quel framework JS est le meilleur? React vs Angular vs Vue: Quel framework JS est le meilleur? Jul 05, 2025 am 02:24 AM

Quel framework JavaScript est le meilleur choix? La réponse est de choisir la plus appropriée selon vos besoins. 1.RIATT est flexible et gratuit, adapté aux projets moyens et grands qui nécessitent une personnalisation élevée et des capacités d'architecture d'équipe; 2. Angular fournit des solutions complètes, adaptées aux applications au niveau de l'entreprise et à la maintenance à long terme; 3. Vue est facile à utiliser, adaptée à des projets de petite et moyenne taille ou à un développement rapide. De plus, s'il existe une pile technologique existante, la taille de l'équipe, le cycle de vie du projet et si le RSS est nécessaire sont également des facteurs importants dans le choix d'un cadre. En bref, il n'y a pas absolument le meilleur cadre, le meilleur choix est celui qui convient à vos besoins.

Objet JavaScript Time, quelqu'un construit un site Web Eactexe, plus rapide sur Google Chrome, etc. Objet JavaScript Time, quelqu'un construit un site Web Eactexe, plus rapide sur Google Chrome, etc. Jul 08, 2025 pm 02:27 PM

Bonjour, développeurs JavaScript! Bienvenue dans JavaScript News de cette semaine! Cette semaine, nous nous concentrerons sur: le différend de marque d'Oracle avec Deno, les nouveaux objets Time JavaScript sont pris en charge par les navigateurs, les mises à jour Google Chrome et certains outils de développeurs puissants. Commen?ons! Le différend de marque d'Oracle avec la tentative de Deno Oracle d'enregistrer une marque "JavaScript" a provoqué la controverse. Ryan Dahl, le créateur de Node.js et Deno, a déposé une pétition pour annuler la marque, et il pense que JavaScript est un niveau ouvert et ne devrait pas être utilisé par Oracle

Qu'est-ce que l'API Cache et comment est-elle utilisée avec les travailleurs du service? Qu'est-ce que l'API Cache et comment est-elle utilisée avec les travailleurs du service? Jul 08, 2025 am 02:43 AM

Cacheapi est un outil fourni par le navigateur pour mettre en cache les demandes de réseau, qui est souvent utilisée en conjonction avec travailleur de service pour améliorer les performances du site Web et l'expérience hors ligne. 1. Il permet aux développeurs de stocker manuellement des ressources telles que des scripts, des feuilles de style, des photos, etc.; 2. Il peut faire correspondre les réponses du cache en fonction des demandes; 3. Il prend en charge la suppression des caches spécifiques ou la nettoyage du cache entier; 4. Il peut mettre en ?uvre des stratégies de priorité de cache ou de priorité de réseau grace à l'écoute des événements Fetch; 5. Il est souvent utilisé pour le support hors ligne, accélérez la vitesse d'accès répétée, préchargement des ressources clés et du contenu de mise à jour des antécédents; 6. Lorsque vous l'utilisez, vous devez faire attention au contr?le de la version du cache, aux restrictions de stockage et à la différence entre le mécanisme de mise en cache HTTP.

Gestion des promesses: cha?nage, gestion des erreurs et combinateurs de promesses en javascript Gestion des promesses: cha?nage, gestion des erreurs et combinateurs de promesses en javascript Jul 08, 2025 am 02:40 AM

La promesse est le mécanisme central pour gérer les opérations asynchrones en JavaScript. Comprendre les appels de cha?ne, la gestion des erreurs et les combinants est la clé pour ma?triser leurs applications. 1. L'appel de la cha?ne renvoie une nouvelle promesse à travers. Puis () pour réaliser la concaténation des processus asynchrones. Chaque .then () re?oit le résultat précédent et peut renvoyer une valeur ou une promesse; 2. La gestion des erreurs doit utiliser .catch () pour attraper des exceptions pour éviter les défaillances silencieuses, et peut renvoyer la valeur par défaut dans Catch pour continuer le processus; 3. Combinateurs tels que promesse.all () (réussi avec succès uniquement après tout succès), promesse.race () (le premier achèvement est retourné) et promesse.allsetTled () (en attente de toutes les achèvements)

Tire de tirage. Tire de tirage. Jul 06, 2025 am 02:36 AM

Des méthodes intégrées de la matrice JavaScript telles que .map (), .filter () et .reduce () peuvent simplifier le traitement des données; 1) .map () est utilisé pour convertir les éléments un en un pour générer de nouveaux tableaux; 2) .filter () est utilisé pour filtrer les éléments par condition; 3) .reduce () est utilisé pour agréger les données en tant que valeur unique; Une mauvaise utilisation doit être évitée lorsqu'elle est utilisée, entra?nant des effets secondaires ou des problèmes de performance.

JS Roundup: une plongée profonde dans la boucle d'événement JavaScript JS Roundup: une plongée profonde dans la boucle d'événement JavaScript Jul 08, 2025 am 02:24 AM

La boucle d'événement de JavaScript gère les opérations asynchrones en coordonnant les piles d'appels, les webapis et les files d'attente de taches. 1. La pile d'appels exécute du code synchrone, et lors de la rencontre de taches asynchrones, il est remis à WebAPI pour le traitement; 2. Une fois que le WebAPI a terminé la tache en arrière-plan, il met le rappel dans la file d'attente correspondante (macro tache ou micro tache); 3. La boucle d'événement vérifie si la pile d'appels est vide. S'il est vide, le rappel est retiré de la file d'attente et poussé dans la pile d'appels pour l'exécution; 4. Micro taches (comme Promise. puis) ??prendre la priorité sur les taches macro (telles que Settimeout); 5. Comprendre la boucle d'événements permet d'éviter de bloquer le thread principal et d'optimiser l'ordre d'exécution du code.

See all articles