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
Promise
est créé avecnew Promise
. L’argument est une fonction qui prend deux rappels :resolve
pour la réussite etreject
pour l’échec. setTimeout
est utilisé pour appelerresolve()
après une seconde.- La méthode
then()
de l'objetpromise
attend 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 laPromise
ré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 unthen
est transmise authen
suivant. - 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 lesPromises
ré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 lesPromise
sont 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
Promise
accompli 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é
Promise
est 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
Promises
ensemble en utilisantPromise.all()
ouPromise.race()
. async
/await
est une syntaxe pour écrire lesPromises
de 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.