Classe Promise en JavaScript
Dans cet article, nous expliquons la classe Promise en JavaScript.
YouTube Video
Promise
La classe Promise est une classe pour gérer les opérations asynchrones. Elle gère les résultats si l'opération réussit ou les erreurs si elle échoue. Traditionnellement, les fonctions de rappel étaient utilisées lorsque vous deviez attendre qu'une opération asynchrone se termine, mais Promise rend cela plus clair et plus puissant.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => resolve("Done!"), 1000);
3});
4
5// Displays "Done!" after 1 second
6promise.then(result => console.log(result));- Ce code est un exemple de processus asynchrone qui affiche « Terminé ! » après une seconde.
- Tout d'abord, un nouvel objet
Promiseest créé avecnew Promise. L’argument est une fonction qui prend deux rappels :resolvepour la réussite etrejectpour l’échec. setTimeoutest utilisé pour appelerresolve()après une seconde.- La méthode
then()de l'objetpromiseattend la fin du traitement et affiche le résultat.
- Tout d'abord, un nouvel objet
Structure de base
Une Promise est un objet qui aboutit finalement à une réussite ou à un échec.
1const promise = new Promise((resolve, reject) => {
2 // Asynchronous operation
3 // Flag indicating whether the operation was successful
4 const success = true;
5
6 if (success) {
7 resolve('Operation successful!');
8 } else {
9 reject('An error occurred');
10 }
11});- Dans le cas d’une réussite,
resolve()est appelé. - Dans le cas d’un échec,
reject()est appelé.
Un objet Promise a trois états.
1promise
2 .then((result) => {
3 console.log(result);
4 })
5 .catch((error) => {
6 console.error(error);
7 })- En attente
- Le processus asynchrone n’est pas encore terminé.
- Accomplie
- Le processus asynchrone a réussi et le résultat a été retourné par
resolve(). Le résultat est reçu en utilisant la méthodethen().
- Le processus asynchrone a réussi et le résultat a été retourné par
- Rejetée
- Le processus asynchrone a échoué et une erreur est survenue via
reject(). L’erreur est reçue en utilisant la méthodecatch().
- Le processus asynchrone a échoué et une erreur est survenue via
Méthodes then() et catch()
Avec une Promise, vous pouvez définir quoi faire lorsqu'une opération asynchrone se termine. Pour cela, vous utilisez les méthodes then() et catch().
then()
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise.then((result) => {
6 console.log(result); // "Operation successful!"
7});- La méthode
then()spécifie une fonction à appeler lorsque laPromiseréussit.
catch()
1const promise = new Promise((resolve, reject) => {
2 reject('An error occurred');
3});
4
5promise.catch((error) => {
6 console.error(error); // "An error occurred"
7});- La méthode
catch()spécifie une fonction à appeler lorsque laPromiseéchoue.
Méthode finally()
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise
6 .then((result) => {
7 console.log(result);
8 })
9 .catch((error) => {
10 console.error(error);
11 })
12 .finally(() => {
13 console.log('The operation has completed');
14 });- La méthode
finally()définit du code qui sera exécuté à la fin quel que soit le résultat de laPromise, réussie ou échouée.
Chaînage de then()
then() retourne une nouvelle Promise, vous pouvez donc enchaîner le then() suivant.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => {
3 resolve(1);
4 }, 1000);
5});
6
7promise
8 .then(result => {
9 console.log(result); // 1
10 return result + 1;
11 })
12 .then(result => {
13 console.log(result); // 2
14 return result + 1;
15 })
16 .then(result => {
17 console.log(result); // 3
18 })
19 .catch(error => {
20 console.error(error.message); // Something went wrong
21 });- Dans ce code, le
resolve()initial transmet la valeur 1, et chaque valeur retournée par unthenest transmise authensuivant. - En utilisant
catch(), vous pouvez gérer toutes les erreurs qui se produisent dans la chaîne à un seul endroit.
Exemple Pratique
Par exemple, les Promises sont souvent utilisées pour récupérer des données depuis un serveur. Voyons un exemple utilisant l'API fetch().
1fetch('https://codesparklab.com/json/example.json')
2 .then(response => {
3 if (!response.ok) {
4 throw new Error('Network error');
5 }
6 return response.json();
7 })
8 .then(data => {
9 console.log(data);
10 })
11 .catch(error => {
12 console.error('Error:', error);
13 });- Dans ce code, comme
fetch()renvoie unePromise, on utilisethen()pour traiter les données après avoir reçu une réponse du serveur. Les erreurs sont gérées aveccatch().
Gérer Plusieurs Promises
Promise.all()
Pour exécuter plusieurs Promises simultanément et continuer uniquement si toutes réussissent, utilisez Promise.all().
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.resolve(2);
3const promise3 = Promise.resolve(3);
4
5Promise.all([promise1, promise2, promise3])
6 .then((results) => {
7 console.log(results); // [1, 2, 3]
8 })
9 .catch((error) => {
10 console.error('Error :', error);
11 });then()est appelé uniquement si toutes lesPromisesréussissent.catch()est appelé si ne serait-ce qu'une seule échoue.
Promise.allSettled()
Si vous souhaitez exécuter plusieurs Promise simultanément et obtenir tous les résultats, qu'ils aboutissent ou échouent, utilisez Promise.allSettled().
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.reject("Failed");
3const promise3 = Promise.resolve(3);
4
5Promise.allSettled([promise1, promise2, promise3])
6 .then((results) => {
7 results.forEach(result => console.log(result));
8 // [
9 // { status: 'fulfilled', value: 1 },
10 // { status: 'rejected', reason: 'Failed' },
11 // { status: 'fulfilled', value: 3 }
12 // ]
13 });then()est appelé une fois que toutes lesPromisesont terminées (soit résolues, soit rejetées). Chaque résultat comprend une propriétéstatus('fulfilled'ou'rejected'). Même si certaines échouent, cela n'affecte pas les autres opérations.
Promise.race()
Promise.race() retourne le résultat de la Promise qui se termine en premier, qu’elle soit accomplie ou rejetée.
1const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
2const promise2 = new Promise((resolve) => setTimeout(resolve, 500, 'Second'));
3
4Promise.race([promise1, promise2]).then((result) => {
5 console.log(result); // "First"
6});- Comme dans cet exemple, le résultat du premier
Promiseaccompli est retourné.
Relation avec async/await
Utiliser la syntaxe async/await permet d'écrire les Promises de manière plus intuitive. Une fonction async renvoie toujours une Promise, et await attend que la Promise soit résolue.
1async function fetchData() {
2 try {
3 const response = await fetch('https://codesparklab.com/json/example.json');
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error('Error :', error);
8 }
9}
10
11fetchData();En utilisant async/await de cette manière, les opérations asynchrones peuvent être écrites comme du code synchrone, ce qui facilite la lecture.
Résumé
Promiseest un objet pour gérer le succès ou l'échec des opérations asynchrones.- Gérez les opérations réussies avec
then()et les erreurs aveccatch(). finally()définit du code qui s'exécute à la fin, quelle que soit la réussite ou l'échec.- Vous pouvez gérer plusieurs
Promisesensemble en utilisantPromise.all()ouPromise.race(). async/awaitest une syntaxe pour écrire lesPromisesde façon plus simple.
Vous pouvez suivre l'article ci-dessus avec Visual Studio Code sur notre chaîne YouTube. Veuillez également consulter la chaîne YouTube.