// =================================================================== // Machine à café — version avec async/await // =================================================================== /** * @typedef {object} CoffeeMachineConfig * @property {number} TEMPS_SELECTION - Temps en ms pour sélectionner le café. * @property {number} TEMPS_MOUTURE - Temps en ms pour moudre les grains. * @property {number} TEMPS_CHAUFFAGE - Temps en ms pour chauffer l'eau. * @property {number} TEMPS_PREPARATION - Temps en ms pour la préparation finale. * @property {number} CLEANING_TIME - Temps en ms pour laver la tasse. */ /** @type {CoffeeMachineConfig} */ const config = { TEMPS_SELECTION: 500, TEMPS_MOUTURE: 700, TEMPS_CHAUFFAGE: 1000, TEMPS_PREPARATION: 500, TEMPS_NETTOYER: 600, }; // --- API de la machine à café (fonctions "promisifiées") --- // Chaque fonction retourne une Promise, simulant une opération asynchrone. // Cette encapsulation sépare la "logique métier" de son orchestration. const coffeeApi = { /** * Simule la sélection d'un type de café. * @param {string} coffeeName - le nom du café à sélectionner. * @returns {Promise} une promesse qui se résout avec le nom du café. Rejette si aucun nom n'est fourni. */ selectionnerCafe(coffeeName) { return new Promise((resolve, reject) => { console.log(` - Sélection du café : ${coffeeName}...`); setTimeout(() => { if (!coffeeName) { return reject(new Error("Aucun type de café n'a été spécifié.")); } console.log(` -> Café "${coffeeName}" sélectionné.`); resolve(coffeeName); }, config.TEMPS_SELECTION); }); }, // TODO : implémenter les autres fonctions de l'API de la machine à café. }; // --- Orchestration des Scénarios --- /** * Scénario 1 : préparation simple. * Les tâches s'exécutent les unes après les autres. Simple mais plus lent. */ async function runSequentialPreparation() { console.log("\n--- SCÉNARIO 1 : préparation simple ---"); console.time("Temps total (séquentiel)"); try { // TODO : implémenter le scénario 1 en utilisant async/await. //console.log(`\nSUCCÈS : votre ${finalCoffee} est servi !`); } catch (error) { console.error("ERREUR : la préparation a échoué.", error.message); } finally { console.timeEnd("Temps total (séquentiel)"); } } /** * Scénario 2 : préparation optimisée avec exécution concurrente de certaines tâches. * Les tâches indépendantes (moudre, chauffer, laver) sont lancées en même temps. */ async function runOptimizedPreparation() { console.log("\n--- SCÉNARIO 2 : préparation optimisée, avec exécution concurrente de certaines tâches ---"); console.time("Temps total (optimisé)"); try { // TODO : implémenter le scénario 2 en utilisant async/await et Promise.all. // Astuce : Promise.all retourne un tableau contenant les résultats des promesses dans le même ordre. // Vous pouvez utiliser la déstructuration pour les récupérer facilement : const [resultat1, resultat2, ...] = await Promise.all(...) //console.log(`\nSUCCÈS (optimisé) : votre ${finalCoffee} est servi !`); } catch (error) { console.error("ERREUR (optimisé) : la préparation a échoué.", error.message); } finally { console.timeEnd("Temps total (optimisé)"); } } /** * Point d'entrée principal pour lancer les démonstrations. */ async function main() { console.log("=".repeat(50)); console.log("Démonstration de la gestion asynchrone en JavaScript"); console.log("=".repeat(50)); await runSequentialPreparation(); console.log("\n" + "-".repeat(50) + "\n"); await runOptimizedPreparation(); } // Lancement du script main();