Files
ENI-JSAdvanced_02/index.js
2025-12-15 16:08:10 +01:00

111 lines
3.7 KiB
JavaScript

// ===================================================================
// Orchestration de la préparation d'un plat de pâtes
//
// Objectifs :
// 1. utiliser `async/await` pour écrire un code asynchrone lisible.
// 2. gérer les erreurs potentielles avec un bloc `try/catch`.
// 3. optimiser le temps de préparation avec `Promise.all`.
// ===================================================================
import { apiCuisson } from './api_cuisson.js';
/**
* Scénario 1 : préparation séquentielle.
* Chaque étape attend la fin de la précédente. C'est simple mais lent.
*/
async function preparationSequentielle() {
console.log("\n--- SCÉNARIO 1 : préparation séquentielle (non optimisée) ---");
console.time("Temps total (séquentiel)");
try {
const typePates = "Spaghetti";
const typeSauce = "Bolognaise";
console.log(`Lancement de la préparation pour : ${typePates} ${typeSauce}.`);
// TODO : utiliser l'API de cuisson pour chaque étape, en séquence.
// ... votre code ici ...
console.log(`\nSUCCÈS : votre '${platFinal}' est prêt !`);
} catch (error) {
console.error("ERREUR : La préparation a échoué.", error.message);
} finally {
// Ce bloc s'exécute toujours, que ce soit un succès ou un échec.
console.timeEnd("Temps total (séquentiel)");
}
}
/**
* Scénario 2 : préparation optimisée.
* Les tâches indépendantes (chauffer l'eau, préparer la sauce) sont
* lancées en parallèle pour gagner du temps.
*/
async function preparationOptimisee() {
console.log("\n--- SCÉNARIO 2 : préparation optimisée (avec Promise.all) ---");
console.time("Temps total (optimisé)");
try {
const typePates = "Penne";
const typeSauce = "Arrabbiata";
console.log(`Lancement de la préparation pour : ${typePates} ${typeSauce}.`);
console.log("-> Lancement en parallèle du chauffage de l'eau et de la préparation de la sauce...");
// TODO : utiliser Promise.all pour lancer les tâches indépendantes en parallèle.
// ... votre code ici ...
console.log("-> Eau bouillante et sauce prête ! On peut lancer la cuisson des pâtes.");
// TODO : cuire les pâtes et finaliser le plat.
// ... votre code ici ...
console.log(`\nSUCCÈS (optimisé) : votre '${platFinal}' est prêt !`);
} catch (error) {
console.error("ERREUR (optimisé) : la préparation a échoué.", error.message);
} finally {
console.timeEnd("Temps total (optimisé)");
}
}
// Petit utilitaire pour créer une pause non-bloquante
const delai = (ms) => new Promise(resolve => setTimeout(resolve, ms));
/**
* Une tâche de fond asynchrone qui s'exécute en boucle.
* @param {number} nb_tours - Nombre d'itérations avant d'arrêter.
*/
async function activiteAsyncEnBoucle(nb_tours = 10) {
let compteur = 0;
console.log("Lancement de l'activité ASYNC en boucle...");
// La boucle s'exécute un nombre de fois défini par nb_tours
while ( compteur < nb_tours ) {
console.log(`L'application est vivante ! (tâche async tic: ${++compteur})`);
// On attend de manière non-bloquante
await delai(500);
}
console.log("Tâche async en boucle terminée.");
}
/**
* Point d'entrée principal du script.
*/
async function main() {
console.log("=".repeat(60));
console.log("Démonstration de code JavaScript asynchrone : la cuisine");
console.log("=".repeat(60));
await preparationSequentielle();
//await Promise.all([activiteAsyncEnBoucle(), preparationSequentielle()]);
console.log("\n" + "-".repeat(60) + "\n");
await preparationOptimisee();
}
// Lancement de la démonstration
main();