// =================================================================== // 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();