Les promesses sont un moyen de gérer le code asynchrone en JavaScript, sans écrire trop de rappels dans votre code.
- Introduction aux promesses
- Créer une promesse
- Consommer une promesse
- Enchaîner les promesses
- Gestion des erreurs
- Orchestrer les promesses
- Erreurs courantes
Introduction aux promesses
Une promesse est généralement définie commeun proxy pour une valeur qui deviendra éventuellement disponible.
Les promesses sont un moyen de gérer le code asynchrone, sans écrire trop de rappels dans votre code.
Bien qu'ils existent depuis des années, ils ont été standardisés et introduits dansES2015, et maintenant ils ont été remplacés dansES2017parfonctions asynchrones.
Fonctions asynchronesutilisez l'API des promesses comme bloc de construction, il est donc fondamental de les comprendre, même si dans un code plus récent, vous utiliserez probablement des fonctions asynchrones au lieu de promesses.
Comment fonctionnent les promesses, en bref
Une fois qu'une promesse a été appelée, elle commencera dansétat en attente. Cela signifie que la fonction appelante continue l'exécution, pendant qu'elle attend la promesse de faire son propre traitement, et donne à la fonction appelante un retour d'information.
À ce stade, la fonction appelante attend qu'elle renvoie la promesse dans unétat résolu, ou dans unétat rejeté, maisla fonction continue son exécution pendant que la promesse fonctionne.
Quelle API JS utilise les promesses?
En plus de votre propre code et code de bibliothèque, les promesses sont utilisées par les API Web modernes standard telles que:
- l'API Battery
- leRécupérer l'API
- Travailleurs des services
Il est peu probable que dans JavaScript moderne vous vous retrouvezne pasen utilisant les promesses, alors commençons à y plonger.
Créer une promesse
L'API Promise expose un constructeur Promise, que vous initialisez à l'aide denew Promise()
:
let done = true
const isItDoneYet = new Promise((resolve, reject) => {
if (done) {
const workDone = ‘Here is the thing I built’
resolve(workDone)
} else {
const why = ‘Still working on something else’
reject(why)
}
})
Comme vous pouvez le voir, la promesse vérifie ledone
variable globale, et si c'est vrai, nous retournons une promesse résolue, sinon une promesse rejetée.
Utilisantresolve
etreject
nous pouvons renvoyer une valeur, dans le cas ci-dessus, nous renvoyons simplement une chaîne, mais cela pourrait également être un objet.
Consommer une promesse
Dans la dernière section, nous avons présenté comment une promesse est créée.
Voyons maintenant comment la promesse peut êtreconsomméou utilisé.
const isItDoneYet = new Promise()
//...
const checkIfItsDone = () => {
isItDoneYet
.then(ok => {
console.log(ok)
})
.catch(err => {
console.error(err)
})
}
FonctionnementcheckIfItsDone()
exécutera leisItDoneYet()
promet et attendra sa résolution, en utilisant lethen
callback, et s'il y a une erreur, il la gérera dans lecatch
rappeler.
Enchaîner les promesses
Une promesse peut être retournée à une autre promesse, créant une chaîne de promesses.
Un bon exemple d'enchaînement des promesses est donné par leRécupérer l'API, une couche au-dessus de l'API XMLHttpRequest, que nous pouvons utiliser pour obtenir une ressource et mettre en file d'attente une chaîne de promesses à exécuter lorsque la ressource est récupérée.
L'API Fetch est un mécanisme basé sur la promesse et appelantfetch()
équivaut à définir notre propre promesse en utilisantnew Promise()
.
Exemple d'enchaînement des promesses
const status = response => {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
}
return Promise.reject(new Error(response.statusText))
}
const json = response => response.json()
fetch(’/todos.json’)
.then(status)
.then(json)
.then(data => {
console.log(‘Request succeeded with JSON response’, data)
})
.catch(error => {
console.log(‘Request failed’, error)
})
Dans cet exemple, nous appelonsfetch()
pour obtenir une liste d'articles TODO à partir dutodos.json
fichier trouvé dans la racine du domaine, et nous créons une chaîne de promesses.
Fonctionnementfetch()
renvoie unréponse, qui a de nombreuses propriétés, et parmi celles que nous référencons:
status
, une valeur numérique représentant le code d'état HTTPstatusText
, un message d'état, qui estOK
si la demande réussit
response
a également unjson()
méthode, qui renvoie une promesse qui se résoudra avec le contenu du corps traité et transformé enJSON.
Donc, compte tenu de ces prémisses, voici ce qui se passe: la première promesse de la chaîne est une fonction que nous avons définie, appeléestatus()
, qui vérifie l'état de la réponse et si ce n'est pas une réponse de succès (entre 200 et 299), il rejette la promesse.
Cette opération amènera la chaîne de promesses à ignorer toutes les promesses enchaînées répertoriées et passera directement à lacatch()
en bas, en enregistrant leRequest failed
texte avec le message d'erreur.
Si cela réussit à la place, il appelle lejson()
fonction que nous avons définie. Depuis la promesse précédente, en cas de succès, a renvoyé leresponse
objet, nous l'obtenons en tant qu'entrée de la deuxième promesse.
Dans ce cas, nous renvoyons les données traitées par JSON, donc la troisième promesse reçoit directement le JSON:
.then((data) => {
console.log('Request succeeded with JSON response', data)
})
et nous le connectons à la console.
Gestion des erreurs
Dans l'exemple ci-dessus, dans la section précédente, nous avions uncatch
cela a été ajouté à la chaîne des promesses.
Quand quelque chose dans la chaîne des promesses échoue et génère une erreur ou rejette la promesse, le contrôle va au plus prochecatch()
déclaration en bas de la chaîne.
new Promise((resolve, reject) => {
throw new Error('Error')
}).catch(err => {
console.error(err)
})
// or
new Promise((resolve, reject) => {
reject(‘Error’)
}).catch(err => {
console.error(err)
})
Erreurs en cascade
Si à l'intérieur ducatch()
vous soulevez une erreur, vous pouvez en ajouter une secondecatch()
pour le gérer, et ainsi de suite.
new Promise((resolve, reject) => {
throw new Error('Error')
})
.catch(err => {
throw new Error('Error')
})
.catch(err => {
console.error(err)
})
Orchestrer les promesses
Promise.all()
Si vous avez besoin de synchroniser différentes promesses,Promise.all()
vous aide à définir une liste de promesses et à exécuter quelque chose lorsqu'elles sont toutes résolues.
Exemple:
const f1 = fetch('/something.json')
const f2 = fetch('/something2.json')
Promise.all([f1, f2])
.then(res => {
console.log(‘Array of results’, res)
})
.catch(err => {
console.error(err)
})
LeMission de déstructuration ES2015la syntaxe vous permet également de faire
Promise.all([f1, f2]).then(([res1, res2]) => {
console.log('Results', res1, res2)
})
Vous n'êtes pas limité à l'utilisationfetch
bien sûr,toute promesse est bonne.
Promise.race()
Promise.race()
s'exécute dès qu'une des promesses que vous lui transmettez se résout, et il exécute le rappel joint une seule fois avec le résultat de la première promesse résolue.
Exemple:
const promiseOne = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one')
})
const promiseTwo = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two')
})
Promise.race([promiseOne, promiseTwo]).then(result => {
console.log(result) // ‘two’
})
Erreurs courantes
Uncaught TypeError: undefined n'est pas une promesse
Si vous obtenez leUncaught TypeError: undefined is not a promise
erreur dans la console, assurez-vous d'utilisernew Promise()
au lieu de justePromise()
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