JavaScript est synchrone par défaut et est à thread unique. Cela signifie que le code ne peut pas créer de nouveaux threads et s'exécuter en parallèle. Découvrez ce que signifie le code asynchrone et à quoi il ressemble
- Asynchronicité dans les langages de programmation
- JavaScript
- Rappels
- Gestion des erreurs dans les rappels
- Le problème des rappels
- Alternatives aux rappels
Asynchronicité dans les langages de programmation
Les ordinateurs sont asynchrones de par leur conception.
Asynchrone signifie que les choses peuvent se produire indépendamment du déroulement du programme principal.
Dans les ordinateurs consommateurs actuels, chaque programme s'exécute pendant une plage horaire spécifique, puis il arrête son exécution pour permettre à un autre programme de continuer son exécution. Cette chose fonctionne dans un cycle si rapide qu'il est impossible de le remarquer, et nous pensons que nos ordinateurs exécutent de nombreux programmes simultanément, mais c'est une illusion (sauf sur les machines multiprocesseurs).
Programmes utilisés en interneinterrompt, un signal émis vers le processeur pour attirer l'attention du système.
Je n'entrerai pas dans les détails internes de cela, mais gardez simplement à l'esprit qu'il est normal que les programmes soient asynchrones et interrompent leur exécution jusqu'à ce qu'ils aient besoin d'attention, et que l'ordinateur puisse exécuter d'autres choses entre-temps. Lorsqu'un programme attend une réponse du réseau, il ne peut pas arrêter le processeur tant que la requête n'est pas terminée.
Normalement, les langages de programmation sont synchrones, et certains fournissent un moyen de gérer l'asynchronicité, dans le langage ou via des bibliothèques. C, Java, C #, PHP, Go, Ruby, Swift, Python, ils sont tous synchrones par défaut. Certains d'entre eux gèrent l'async en utilisant des threads, engendrant un nouveau processus.
JavaScript
JavaScript estsynchronepar défaut et est à thread unique. Cela signifie que le code ne peut pas créer de nouveaux threads et s'exécuter en parallèle.
Les lignes de code sont exécutées en série, l'une après l'autre, par exemple:
const a = 1
const b = 2
const c = a * b
console.log(c)
doSomething()
Mais JavaScript est né à l'intérieur du navigateur, son travail principal, au début, était de répondre aux actions des utilisateurs, commeonClick
,onMouseOver
,onChange
,onSubmit
etc. Comment pourrait-il faire cela avec un modèle de programmation synchrone?
La réponse était dans son environnement. Lele navigateurfournit un moyen de le faire en fournissant un ensemble d'API capables de gérer ce type de fonctionnalité.
Plus récemment, Node.js a introduit un environnement d'E / S non bloquant pour étendre ce concept à l'accès aux fichiers, aux appels réseau, etc.
Rappels
Vous ne pouvez pas savoir quand un utilisateur cliquera sur un bouton, alors ce que vous faites, c'est que vousdéfinir un gestionnaire d'événements pour l'événement click. Ce gestionnaire d'événements accepte une fonction, qui sera appelée lorsque l'événement est déclenché:
document.getElementById('button').addEventListener('click', () => {
//item clicked
})
C'est le soi-disantrappeler.
Un rappel est une fonction simple qui est passée en tant que valeur à une autre fonction et ne sera exécutée que lorsque l'événement se produit. Nous pouvons le faire car JavaScript a des fonctions de première classe, qui peuvent être affectées à des variables et transmises à d'autres fonctions (appeléesfonctions d'ordre supérieur)
Il est courant d'encapsuler tout votre code client dans unload
écouteur d'événement sur lewindow
object, qui exécute la fonction de rappel uniquement lorsque la page est prête:
window.addEventListener('load', () => {
//window loaded
//do what you want
})
Les rappels sont utilisés partout, pas seulement dans les événements DOM.
Un exemple courant est l'utilisation de minuteries:
setTimeout(() => {
// runs after 2 seconds
}, 2000)
Les requêtes XHR acceptent également un rappel, dans cet exemple en affectant une fonction à une propriété qui sera appelée lorsqu'un événement particulier se produit (dans ce cas, l'état de la requête change):
const xhr = new XMLHttpRequest()
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
xhr.status === 200 ? console.log(xhr.responseText) : console.error('error')
}
}
xhr.open('GET', 'https://yoursite.com')
xhr.send()
Gestion des erreurs dans les rappels
Comment gérez-vous les erreurs avec les rappels? Une stratégie très courante consiste à utiliser ce que Node.js a adopté: le premier paramètre de toute fonction de rappel est l'objet d'erreur:rappels d'erreur en premier
S'il n'y a pas d'erreur, l'objet estnull
. S'il y a une erreur, il contient une description de l'erreur et d'autres informations.
fs.readFile('/file.json', (err, data) => {
if (err !== null) {
//handle error
console.log(err)
return
}
//no errors, process data
console.log(data)
})
Le problème des rappels
Les rappels sont parfaits pour les cas simples!
Cependant, chaque rappel ajoute un niveau d'imbrication, et lorsque vous avez beaucoup de rappels, le code commence à se compliquer très rapidement:
window.addEventListener('load', () => {
document.getElementById('button').addEventListener('click', () => {
setTimeout(() => {
items.forEach(item => {
//your code here
})
}, 2000)
})
})
C'est juste un simple code à 4 niveaux, mais j'ai vu beaucoup plus de niveaux d'imbrication et ce n'est pas amusant.
Comment pouvons-nous résoudre ce problème?
Alternatives aux rappels
À partir de ES6, JavaScript a introduit plusieurs fonctionnalités qui nous aident avec du code asynchrone qui n'implique pas l'utilisation de rappels:
- Promesses(ES2015)
- Asynchrone / Attendre(ES2017)
Téléchargez mon gratuitManuel du débutant JavaScript
Plus de tutoriels js:
- Choses à éviter en JavaScript (les mauvaises parties)
- Différés et promesses en JavaScript (+ exemple Ember.js)
- Comment télécharger des fichiers sur le serveur à l'aide de JavaScript
- Style de codage JavaScript
- Une introduction aux tableaux JavaScript
- Introduction au langage de programmation JavaScript
- Le guide complet ECMAScript 2015-2019
- Comprendre les promesses JavaScript
- La structure lexicale de JavaScript
- Types JavaScript
- Variables JavaScript
- Une liste d'exemples d'idées d'applications Web
- Une introduction à la programmation fonctionnelle avec JavaScript
- JavaScript asynchrone moderne avec Async et Await
- Boucles et portée JavaScript
- La structure des données JavaScript de la carte
- La structure de données JavaScript définie
- Un guide sur les littéraux de modèle JavaScript
- Feuille de route pour apprendre JavaScript
- Expressions JavaScript
- Découvrez les minuteries JavaScript
- Explication des événements JavaScript
- Boucles JavaScript
- Écrire des boucles JavaScript à l'aide de la carte, filtrer, réduire et rechercher
- La boucle d'événements JavaScript
- Fonctions JavaScript
- Le glossaire JavaScript
- Les fermetures JavaScript expliquées
- Un tutoriel sur les fonctions de flèche JavaScript
- Un guide des expressions régulières JavaScript
- Comment vérifier si une chaîne contient une sous-chaîne en JavaScript
- Comment supprimer un élément d'un tableau en JavaScript
- Comment cloner en profondeur un objet JavaScript
- Introduction to Unicode and UTF-8
- Unicode en JavaScript
- Comment mettre en majuscule la première lettre d'une chaîne en JavaScript
- Comment mettre en forme un nombre en tant que valeur monétaire en JavaScript
- Comment convertir une chaîne en un nombre en JavaScript
- ceci en JavaScript
- Comment obtenir l'horodatage actuel en JavaScript
- Mode strict de JavaScript
- Expressions de fonction JavaScript immédiatement appelées (IIFE)
- Comment rediriger vers une autre page Web à l'aide de JavaScript
- Comment supprimer une propriété d'un objet JavaScript
- Comment ajouter un élément à un tableau en JavaScript
- Comment vérifier si une propriété d'objet JavaScript n'est pas définie
- Introduction aux modules ES
- Introduction à CommonJS
- Programmation asynchrone JavaScript et rappels
- Comment remplacer toutes les occurrences d'une chaîne en JavaScript
- Un guide de référence rapide sur la syntaxe JavaScript moderne
- Comment couper le zéro non significatif dans un nombre en JavaScript
- Comment inspecter un objet JavaScript
- Le guide définitif des dates JavaScript
- Un tutoriel Moment.js
- Points-virgules en JavaScript
- Les opérateurs arithmétiques JavaScript
- L'objet JavaScript Math
- Générer des chaînes aléatoires et uniques en JavaScript
- Comment mettre en veille vos fonctions JavaScript
- Héritage prototypique JavaScript
- Exceptions JavaScript
- Comment utiliser les classes JavaScript
- Le livre de recettes JavaScript
- Citations en JavaScript
- Comment valider une adresse e-mail en JavaScript
- Comment obtenir les propriétés uniques d'un ensemble d'objets dans un tableau JavaScript
- Comment vérifier si une chaîne commence par une autre en JavaScript
- Comment créer une chaîne multiligne en JavaScript
- Le guide ES6
- Comment obtenir l'URL actuelle en JavaScript
- Le guide ES2016
- Comment initialiser un nouveau tableau avec des valeurs en JavaScript
- Le guide ES2017
- Le guide ES2018
- Comment utiliser Async et Await avec Array.prototype.map ()
- Code asynchrone ou synchro
- Comment générer un nombre aléatoire entre deux nombres en JavaScript
- Didacticiel de l'API HTML Canvas
- Comment obtenir l'index d'une itération dans une boucle for-of en JavaScript
- Qu'est-ce qu'une application sur une seule page?
- Une introduction à WebAssembly
- Introduction à JSON
- Le guide JSONP
- Should you use or learn jQuery in 2020?
- Comment masquer un élément DOM à l'aide de JavaScript brut
- Comment fusionner deux objets en JavaScript
- Comment vider un tableau JavaScript
- Comment encoder une URL avec JavaScript
- Comment définir les valeurs de paramètre par défaut dans JavaScript
- Comment trier un tableau d'objets par une valeur de propriété en JavaScript
- Comment compter le nombre de propriétés dans un objet JavaScript
- call () et apply () en JavaScript
- Introduction à PeerJS, la bibliothèque WebRTC
- Travailler avec des objets et des tableaux à l'aide de Rest and Spread
- Destructuration d'objets et de tableaux en JavaScript
- Le guide définitif du débogage de JavaScript
- Le guide TypeScript
- Sélectionnez dynamiquement une méthode d'un objet en JavaScript
- Passage d'undefined à des expressions de fonction appelées immédiatement JavaScript
- Langages faiblement typés vs langages fortement typés
- Comment styliser des éléments DOM à l'aide de JavaScript
- Diffusion en JavaScript
- Tutoriel sur les générateurs JavaScript
- La taille du dossier node_modules n'est pas un problème. C'est un privilège
- Comment résoudre l'erreur d'identifiant inattendue lors de l'importation de modules dans JavaScript
- Comment lister toutes les méthodes d'un objet en JavaScript
- La méthode String replace ()
- La méthode String search ()
- Comment j'exécute de petits extraits de code JavaScript
- Le guide ES2019
- La méthode String charAt ()
- La méthode String charCodeAt ()
- La méthode String codePointAt ()
- La méthode String concat ()
- La méthode String endsWith ()
- La méthode String includes ()
- La méthode String indexOf ()
- La méthode String lastIndexOf ()
- La méthode String localeCompare ()
- La méthode String match ()
- La méthode String normalize ()
- La méthode String padEnd ()
- La méthode String padStart ()
- La méthode String repeat ()
- La méthode String slice ()
- La méthode String split ()
- La méthode String startsWith ()
- La méthode String substring ()
- La méthode String toLocaleLowerCase ()
- La méthode String toLocaleUpperCase ()
- La méthode String toLowerCase ()
- La méthode String toString ()
- La méthode String toUpperCase ()
- La méthode String trim ()
- La méthode String trimEnd ()
- La méthode String trimStart ()
- Mémorisation en JavaScript
- La méthode String valueOf ()
- Référence JavaScript: String
- La méthode Number isInteger ()
- La méthode Number isNaN ()
- La méthode Number isSafeInteger ()
- La méthode Number parseFloat ()
- La méthode Number parseInt ()
- La méthode Number toString ()
- La méthode Number valueOf ()
- La méthode Number toPrecision ()
- La méthode Number toExponential ()
- La méthode Number toLocaleString ()
- La méthode Number toFixed ()
- La méthode Number isFinite ()
- Référence JavaScript: Number
- Descripteurs de propriété JavaScript
- La méthode Object assign ()
- La méthode Object create ()
- La méthode Object defineProperties ()
- La méthode Object defineProperty ()
- La méthode des entrées d'objets ()
- La méthode Object freeze ()
- La méthode Object getOwnPropertyDescriptor ()
- La méthode Object getOwnPropertyDescriptors ()
- La méthode Object getOwnPropertyNames ()
- La méthode Object getOwnPropertySymbols ()
- La méthode Object getPrototypeOf ()
- La méthode Object is ()
- La méthode Object isExtensible ()
- La méthode Object isFrozen ()
- La méthode Object isSealed ()
- La méthode Object keys ()
- La méthode Object preventExtensions ()
- La méthode Object seal ()
- La méthode Object setPrototypeOf ()
- La méthode Object values ()
- La méthode Object hasOwnProperty ()
- La méthode Object isPrototypeOf ()
- La méthode Object propertyIsEnumerable ()
- La méthode Object toLocaleString ()
- La méthode Object toString ()
- La méthode Object valueOf ()
- Référence JavaScript: objet
- Opérateur d'affectation JavaScript
- Internationalisation JavaScript
- Opérateur JavaScript typeof
- Nouvel opérateur JavaScript
- Opérateurs de comparaison JavaScript
- Règles de priorité des opérateurs JavaScript
- Opérateur d'instance JavaScript
- Déclarations JavaScript
- Portée JavaScript
- Conversions de type JavaScript (diffusion)
- Opérateurs d'égalité JavaScript
- Le JavaScript conditionnel if / else
- Le commutateur JavaScript conditionnel
- L'opérateur de suppression JavaScript
- Paramètres de la fonction JavaScript
- L'opérateur de propagation JavaScript
- Valeurs de retour JavaScript
- Opérateurs logiques JavaScript
- Opérateur ternaire JavaScript
- Récursivité JavaScript
- Propriétés des objets JavaScript
- Objets d'erreur JavaScript
- L'objet global JavaScript
- La fonction JavaScript filter ()
- La fonction JavaScript map ()
- La fonction de réduction de JavaScript ()
- L'opérateur JavaScript `in`
- Opérateurs JavaScript
- Comment obtenir la valeur d'une propriété CSS en JavaScript
- Comment ajouter un écouteur d'événements à plusieurs éléments dans JavaScript
- Champs de classe privée JavaScript
- Comment trier un tableau par valeur de date en JavaScript
- Champs de classe publique JavaScript
- Symboles JavaScript
- Comment utiliser la bibliothèque JavaScript bcrypt
- Comment renommer des champs lors de l'utilisation de la déstructuration d'objets
- Comment vérifier les types en JavaScript sans utiliser TypeScript
- Comment vérifier si un tableau JavaScript contient une valeur spécifique
- Qu'est-ce que l'opérateur de double négation !! faire en JavaScript?
- Quel opérateur égal doit être utilisé dans les comparaisons JavaScript? == vs ===
- JavaScript vaut-il toujours la peine d'être appris?
- Comment renvoyer le résultat d'une fonction asynchrone en JavaScript
- Comment vérifier si un objet est vide en JavaScript
- Comment sortir d'une boucle for en JavaScript
- Comment ajouter un élément à un tableau à un index spécifique en JavaScript
- Pourquoi vous ne devriez pas modifier un prototype d'objet JavaScript
- Quelle est la différence entre l'utilisation de let et var en JavaScript?
- Liens utilisés pour activer les fonctions JavaScript
- Comment joindre deux chaînes en JavaScript
- Comment joindre deux tableaux en JavaScript
- Comment vérifier si une valeur JavaScript est un tableau?
- Comment obtenir le dernier élément d'un tableau en JavaScript?
- Comment envoyer des données encodées par URL à l'aide d'Axios
- Comment obtenir la date de demain en utilisant JavaScript
- Comment obtenir la date d'hier en utilisant JavaScript
- Comment obtenir le nom du mois à partir d'une date JavaScript
- Comment vérifier si deux dates sont le même jour en JavaScript
- Comment vérifier si une date fait référence à un jour dans le passé dans JavaScript
- Instructions étiquetées JavaScript
- Comment attendre 2 promesses ou plus pour se résoudre en JavaScript
- Comment obtenir les jours entre 2 dates en JavaScript
- Comment télécharger un fichier à l'aide de Fetch
- Comment mettre en forme une date en JavaScript
- Comment parcourir les propriétés d'objet en JavaScript
- Comment calculer le nombre de jours entre 2 dates en JavaScript
- Comment utiliser Wait de niveau supérieur dans les modules ES
- Importations dynamiques JavaScript
- Chaînage facultatif JavaScript
- Comment remplacer un espace blanc dans une chaîne en JavaScript
- JavaScript Nullish Coalescing
- Comment aplatir un tableau en JavaScript
- Cette décennie en JavaScript
- Comment envoyer l'en-tête d'autorisation à l'aide d'Axios
- Liste des mots-clés et des mots réservés en JavaScript
- Comment convertir un tableau en chaîne en JavaScript
- Comment supprimer tout le contenu des dossiers node_modules
- Comment supprimer les doublons d'un tableau JavaScript
- Let vs Const en JavaScript
- Le même appel d'API POST dans diverses bibliothèques JavaScript
- Comment obtenir les n premiers éléments d'un tableau dans JS
- Comment diviser un tableau en plusieurs parties égales dans JS
- Comment ralentir une boucle en JavaScript
- Comment charger une image dans un canevas HTML
- Comment couper une chaîne en mots en JavaScript
- Comment diviser un tableau en deux en JavaScript
- Comment écrire du texte dans un canevas HTML
- Comment supprimer le dernier caractère d'une chaîne en JavaScript
- Comment supprimer le premier caractère d'une chaîne en JavaScript
- Comment corriger l'erreur TypeError: impossible d'affecter à la propriété en lecture seule 'exports' de l'objet '# & lt; Object & gt;' Erreur
- Comment créer une fenêtre contextuelle d'intention de sortie
- Comment vérifier si un élément est un descendant d'un autre
- Comment forcer les informations d'identification à chaque demande Axios
- Comment résoudre l'erreur "n'est pas une fonction" dans JavaScript
- Gatsby, comment changer le favicon
- Chargement d'un fichier JS externe à l'aide de Gatsby
- Comment détecter le mode sombre à l'aide de JavaScript
- Colis, comment corriger l'erreur `regeneratorRuntime is not defined`
- Comment détecter si un Adblocker est utilisé avec JavaScript
- Déstructuration d'objets avec des types dans TypeScript
- Le manuel de Deno: une introduction concise à Deno 🦕
- Comment obtenir le dernier segment d'un chemin ou d'une URL à l'aide de JavaScript
- Comment mélanger des éléments dans un tableau JavaScript
- Comment vérifier si une clé existe dans un objet JavaScript
- Événement bouillonnant et capture d'événement
- event.stopPropagation vs event.preventDefault () vs return false dans les événements DOM
- Types primitifs vs objets en JavaScript
- Comment savoir de quel type est une valeur en JavaScript?
- Comment renvoyer plusieurs valeurs à partir d'une fonction en JavaScript
- Fonctions fléchées vs fonctions régulières en JavaScript
- De quelles manières pouvons-nous accéder à la valeur d'une propriété d'un objet?
- Quelle est la différence entre null et undefined en JavaScript?
- Quelle est la différence entre une méthode et une fonction?
- De quelles manières pouvons-nous sortir d'une boucle en JavaScript?
- La boucle JavaScript for..of
- Qu'est-ce que la déstructuration d'objets en JavaScript?
- Qu'est-ce que le levage en JavaScript?
- Comment changer les virgules en points avec JavaScript
- L'importance du timing lorsque vous travaillez avec le DOM
- Comment inverser un tableau JavaScript
- Comment vérifier si une valeur est un nombre en JavaScript
- Comment accepter des paramètres illimités dans une fonction JavaScript
- Objets proxy JavaScript
- Délégation d'événements dans le navigateur à l'aide de JavaScript vanilla
- Le super mot-clé JavaScript
- Introduction à XState
- Les valeurs sont-elles transmises par référence ou par valeur en JavaScript?
- Événements personnalisés en JavaScript
- Erreurs personnalisées dans JavaScript
- Espaces de noms en JavaScript
- Une curieuse utilisation des virgules en JavaScript
- Appels de méthode de chaînage en JavaScript
- Comment gérer les refus de promesse
- Comment échanger deux éléments de tableau en JavaScript
- Comment j'ai corrigé une erreur "cb.apply n'est pas une fonction" lors de l'utilisation de Gitbook
- Comment ajouter un élément au début d'un tableau en JavaScript
- Gatsby, corrige l'erreur "Impossible de trouver le module gatsby-cli / lib / reporter"
- Comment obtenir l'index d'un élément dans un tableau JavaScript
- Comment tester un objet vide en JavaScript
- Comment déstructurer un objet en variables existantes dans JavaScript
- La structure de données JavaScript du tableau
- La structure de données JavaScript de la pile
- Structures de données JavaScript: file d'attente
- Structures de données JavaScript: définir
- Structures de données JavaScript: dictionnaires
- Structures de données JavaScript: listes liées
- JavaScript, comment exporter une fonction
- JavaScript, comment exporter plusieurs fonctions
- JavaScript, comment quitter une fonction
- JavaScript, comment trouver un caractère dans une chaîne
- JavaScript, comment filtrer un tableau
- JavaScript, comment étendre une classe
- JavaScript, comment trouver des doublons dans un tableau
- JavaScript, comment remplacer un élément d'un tableau
- Algorithmes JavaScript: recherche linéaire
- Algorithmes JavaScript: recherche binaire
- Algorithmes JavaScript: tri par sélection
- Algorithmes JavaScript: tri rapide
- Algorithmes JavaScript: tri par fusion
- Algorithmes JavaScript: tri à bulles