Retourner une promesse depuis un service
Objectif : Faire remonter le résultat asynchrone d’une recherche de commandes jusqu’au contrôleur.
Une recherche de commandes peut prendre du temps dès que les données proviennent d’une base ou d’un service distant. Si votre service ne fournit pas son résultat sous forme de promesse, le contrôleur ne peut pas s’appuyer sur cette chaîne asynchrone proprement.
Vous allez faire évoluer la liste des commandes pour qu’elle retourne une promesse, puis transmettre cette promesse jusqu’au contrôleur. La route reste reliée au contrôleur comme à la fin de la leçon précédente.
Faire retourner une promesse au service
Pour l’instant, la liste du projet est vide. Remplacez le contenu de services/commandes.js par le module ci-dessous. Promise.resolve fournit une promesse déjà résolue avec la liste : le contrôleur recevra donc le résultat sous une forme qui pourra aussi représenter une opération réellement asynchrone.
function lister() {
const commandes = [];
return Promise.resolve(commandes);
}
module.exports = {
lister
};La fonction lister retourne maintenant une promesse, et non directement le tableau. Le service garde la responsabilité de fournir les commandes ; il ne connaît ni Express ni la réponse HTTP. Ici, la promesse est résolue immédiatement, mais le contrat de retour sera le même lorsque la récupération des données sera asynchrone.
Transmettre le résultat au contrôleur
Le contrôleur doit attendre que la promesse soit résolue avant de construire la réponse JSON. Avec then, vous fournissez une fonction qui reçoit la liste obtenue. Remplacez le contenu de controleurs/commandes.js par cette version complète, en conservant le format normalisé défini dans la leçon « Lire les requêtes et formater les réponses ».
const commandesService = require('../services/commandes');
function lister(req, res) {
return commandesService.lister().then((commandes) => {
res.status(200).json({
donnees: commandes,
erreur: null
});
});
}
module.exports = {
lister
};Le contrôleur retourne à son tour la promesse créée par then. La fonction passée à then reçoit les commandes et envoie la réponse lorsque le résultat est disponible. La route n’a pas à connaître le détail de cette attente : elle reste associée à lister, comme auparavant.
Vérifier le comportement
Redémarrez le serveur avec votre commande habituelle, puis envoyez une requête GET à /api/commandes. La réponse contient un tableau vide, comme avant, mais le résultat a désormais parcouru une chaîne de promesses entre le service et le contrôleur. Le statut et l’enveloppe JSON restent inchangés.
HTTP/1.1 200 OK
Content-Type: application/json{
"donnees": [],
"erreur": null
}Vous n’avez pas besoin de modifier le routeur ni serveur.js pour cette étape. L’organisation route-contrôleur-service reste celle mise en place précédemment ; seule la manière dont le service fournit le résultat a changé.
À retenir
- Un service peut retourner une promesse au lieu de fournir immédiatement sa valeur.
- Le contrôleur utilise then pour recevoir le résultat résolu et construire la réponse HTTP.
- Retournez la promesse depuis le contrôleur afin que l’opération reste suivable par la couche appelante.
- Le traitement des rejets sera centralisé dans une prochaine leçon.
Dans la leçon suivante, vous remplacerez cette chaîne explicite avec then par un contrôleur utilisant async et await.