
1. L'Ancienne École : Les Callbacks 👹
javaScript
import { readFile } from 'fs';
readFile('./mon-fichier.txt', 'utf8', (error, data) => {
if (error) {
console.error("Oups, une erreur est survenue :", error);
return;
}
console.log(data);
});
javaScript
operation1(..., (err, data) => {
// Niveau 1
operation2(..., (err, data) => {
// Niveau 2
operation3(..., (err, data) => {
// Niveau 3
// Et ainsi de suite... nested hell
});
});
});
2. Une Lueur d'Espoir : Les Promises (Promesses) ✨
- Pending : L'opération n'est pas encore terminée.
- Fulfilled (Tenue) ✅ : L'opération a réussi et a retourné une valeur.
- Rejected (Rejetée) ❌ : L'opération a échoué.
Plain Text
Promesse
|
.then( résultat => ... ) // Succès
|
.then( résultat => ... ) // Succès
|
.catch( erreur => ... ) // Gestion de n'importe quelle erreur dans la chaîne
javaScript
import { promises as fs } from 'fs';
fs.readFile('./mon-fichier.txt', 'utf8')
.then(data => {
console.log("Contenu du fichier :", data);
return fs.writeFile('./copie.txt', data); // On retourne une nouvelle promesse
})
.then(() => {
console.log("Le fichier a été copié avec succès ! 🎉");
})
.catch(error => {
console.error("Une erreur est survenue durant le processus :", error);
});
3. La Révolution : async/await 🪄
- Le mot-clé async se place devant une fonction pour indiquer qu'elle retourne une promesse.
- Le mot-clé await se place devant une opération qui retourne une promesse. Il met en pause l'exécution de la fonction async jusqu'à ce que la promesse soit résolue, sans pour autant bloquer le reste de l'application.
javaScript
async function() {
try {
const resultat1 = await operation1(); // Attente...
const resultat2 = await operation2(); // Attente...
const resultat3 = await operation3(); // Attente...
// C'est simple et linéaire !
} catch (erreur) {
// Gestion de n'importe quelle erreur
}
}
javaScript
import { promises as fs } from 'fs';
async function lireEtCopierFichier() {
try {
const data = await fs.readFile('./mon-fichier.txt', 'utf8');
console.log("Contenu du fichier :", data);
await fs.writeFile('./copie.txt', data);
console.log("Le fichier a été copié avec succès ! 🎉");
} catch (error) {
console.error("Une erreur est survenue durant le processus :", error);
}
}
lireEtCopierFichier();
4. Un Cas Pratique : Une Fonction getContent Optimisée 🏎️
Analyse de la fonction
- Signature async : La fonction est déclarée async, elle retourne donc implicitement une promesse.
- Importations Dynamiques import() : C'est la clé ! import() est une fonction qui retourne une promesse, permettant de charger un module JavaScript de manière asynchrone.
- Gestion d'Erreur Robuste : Le bloc try...catch englobe toutes les opérations. Si une seule importation échoue (par exemple, hero.ts n'existe pas 🔥), l'exécution saute directement au bloc catch.
- Pattern de Retour [data, error] : La fonction retourne un tableau. Soit [données, null] en cas de succès, soit [null, erreur] en cas d'échec.
Une Piste d'Optimisation : La Parallélisation avec Promise.all
Plain Text
// Séquentiel (await l'un après l'autre)
[Tâche 1]--temps-->[Tâche 2]--temps-->[Tâche 3]--temps-->[ FIN ]
Temps total = T1 + T2 + T3
// Parallèle (Promise.all)
|--[Tâche 1]--temps--|
|--[Tâche 2]----temps----|
|--[Tâche 3]---temps---|
|--> [ FIN ]
Temps total = Temps de la tâche la plus longue
typeScript
// ... mêmes définitions de types
export default async function getOptimizedContent(pathArray: string[]): Promise<[any, null] | [null, any]> {
const filePath = `./${pathArray.join('/')}/`;
try {
// 1. On lance toutes les importations en parallèle
const promiseSeo = import(`${filePath}seo.ts`);
const promiseCards = import(`${filePath}cards.ts`);
const promiseServices = import(`${filePath}services.ts`);
const promiseHero = import(`${filePath}hero.ts`);
// 2. On attend que TOUTES les promesses soient résolues
const [
{ seo },
{ cards },
{ services },
{ hero }
] = await Promise.all([promiseSeo, promiseCards, promiseServices, promiseHero]);
// 3. On assemble le résultat
const success = { cards, services, hero, seo };
return [success, null];
} catch (error) {
console.error(`Failed to load module at ${filePath}:`, error);
return [null, error];
}
}
Conclusion
Foire Aux Questions (FAQ)
await bloque-t-il mon application Node.js ?
Quelle est la différence entre Promise.all et Promise.allSettled ?
Dois-je toujours utiliser async/await ?
Pourquoi le pattern de retour [data, error] est-il utile ?
Powered by wisp