Tutoriel de promesse Node.js
Dans les didacticiels prรฉcรฉdents, vous auriez vu des fonctions de rappel utilisรฉes pour les รฉvรฉnements asynchrones. Mais parfois, les fonctions de rappel peuvent devenir un cauchemar lorsqu'elles commencent ร s'imbriquer et que le programme commence ร devenir long et complexe.
Que sont les promesses ?
Avant de commencer avec les promesses, revenons d'abord sur ce que sont les fonctions de ยซ rappel ยป dans Node.js. Nous avons beaucoup vu ces fonctions de rappel dans les chapitres prรฉcรฉdents, passons donc rapidement en revue l'une d'entre elles.
L'exemple ci-dessous montre un extrait de code utilisรฉ pour se connecter ร un MongoDB base de donnรฉes et effectuer une opรฉration de mise ร jour sur l'un des enregistrements de la base de donnรฉes.
- Dans le code ci-dessus, la partie de la fonction (err, db) est connue sous le nom de dรฉclaration d'une fonction anonyme ou de rappel. Lorsque le MongoClient crรฉe une connexion au MongoDB base de donnรฉes, il reviendra ร la fonction de rappel une fois l'opรฉration de connexion terminรฉe. Donc, dans un sens, les opรฉrations de connexion se dรฉroulent en arriรจre-plan, et lorsqu'elles sont terminรฉes, elles appellent notre fonction de rappel. N'oubliez pas que c'est l'un des points clรฉs de Node.js pour permettre ร de nombreuses opรฉrations de se produire simultanรฉment et ainsi ne bloquer aucun utilisateur pour effectuer une opรฉration.
- Le deuxiรจme bloc de code est ce qui est exรฉcutรฉ lorsque la fonction de rappel est rรฉellement appelรฉe. La fonction de rappel met simplement ร jour un enregistrement dans notre MongoDB base de donnรฉes.
Alors, quโest-ce quโune promesse ? Eh bien, une promesse n'est qu'une amรฉlioration des fonctions de rappel dans Node.js. Au cours du cycle de vie de dรฉveloppement, il peut arriver que vous deviez imbriquer plusieurs fonctions de rappel ensemble. Cela peut devenir un peu compliquรฉ et difficile ร maintenir ร un moment donnรฉ. En bref, une promesse est une amรฉlioration des rappels qui vise ร attรฉnuer ces problรจmes.
La syntaxe de base d'une promesse est prรฉsentรฉe ci-dessous ;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- "doSomethingAync" est n'importe quelle fonction de rappel ou asynchrone qui effectue une sorte de traitement.
- Cette fois, lors de la dรฉfinition du rappel, une valeur est renvoyรฉe appelรฉe ยซ promesse ยป.
- Lorsqu'une promesse est renvoyรฉe, elle peut avoir 2 sorties. Ceci est dรฉfini par la ยซ clause then ยป. Soit l'opรฉration peut รชtre un succรจs, ce qui est indiquรฉ par le paramรจtre ยซ onFulfilled ยป. Ou il peut y avoir une erreur indiquรฉe par le paramรจtre ยซ onRejected ยป.
Remarque : Lโaspect clรฉ dโune promesse est donc la valeur de retour. Il n'y a aucun concept de valeur de retour lorsque vous travaillez avec des rappels normaux dans Node.js. Grรขce ร la valeur de retour, nous avons plus de contrรดle sur la faรงon dont la fonction de rappel peut รชtre dรฉfinie.
Dans la rubrique suivante, nous verrons un exemple de promesses et comment elles bรฉnรฉficient des rappels.
Rappels aux promesses
Examinons maintenant un exemple de la faรงon dont nous pouvons utiliser les ยซ promesses ยป ร partir d'une application Node.js. Afin d'utiliser les promesses dans une application Node.js, le module 'promise' doit d'abord รชtre tรฉlรฉchargรฉ et installรฉ.
Nous modifierons ensuite notre code comme indiquรฉ ci-dessous, qui met ร jour un Employeename dans la collection 'Employee' en utilisant des promesses.
รtape 1) Installation des modules NPM
Pour utiliser Promises depuis une application Node JS, le module de promesse est requis. Pour installer le module de promesse, exรฉcutez la commande ci-dessous
promesse d'installation npm
รtape 2) Modifier le code pour inclure des promesses
var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';
MongoClient.connect(url)
.then(function(err, db) {
db.collection('Employee').updateOne({
"EmployeeName": "Martin"
}, {
$set: {
"EmployeeName": "Mohan"
}
});
});
Explication du code : -
- La premiรจre partie consiste ร inclure le module 'promise' qui nous permettra d'utiliser la fonctionnalitรฉ de promesse dans notre code.
- Nous pouvons maintenant ajouter la fonction ยซ alors ยป ร notre fonction MongoClient.connect. Cela fait donc que lorsque la connexion est รฉtablie ร la base de donnรฉes, nous devons exรฉcuter l'extrait de code dรฉfini par la suite.
- Enfin, nous dรฉfinissons notre extrait de code qui effectue le travail de mise ร jour EmployeeName de l'employรฉ portant le nom de ยซ Martin ยป en ยซ Mohan ยป.
Remarque: -
Si vous vรฉrifiez maintenant le contenu de votre MongoDB base de donnรฉes, vous constaterez que si un enregistrement avec EmployeeName de ยซ Martin ยป existe, il sera mis ร jour en ยซ Mohan ยป.
Pour vรฉrifier que les donnรฉes ont รฉtรฉ correctement insรฉrรฉes dans la base de donnรฉes, vous devez exรฉcuter les commandes suivantes dans MongoDB
- Utiliser EmployeeDB
- db.Employee.find({EmployeeName :Mohan })
La premiรจre instruction garantit que vous รชtes connectรฉ ร la base de donnรฉes EmployeeDb. La deuxiรจme instruction recherche l'enregistrement portant le nom d'employรฉ ยซ Mohan ยป.
Gรฉrer les promesses imbriquรฉes
Lors de la dรฉfinition des promesses, il convient de noter que la mรฉthode ยซ alors ยป elle-mรชme renvoie une promesse. Ainsi, dans un sens, les promesses peuvent รชtre imbriquรฉes ou enchaรฎnรฉes les unes aux autres.
Dans l'exemple ci-dessous, nous utilisons le chaรฎnage pour dรฉfinir 2 fonctions de rappel, qui insรจrent toutes deux un enregistrement dans le MongoDB base de donnรฉes.
(Note: Le chaรฎnage est un concept utilisรฉ pour lier l'exรฉcution de mรฉthodes entre elles. Supposons que votre application dispose de 2 mรฉthodes appelรฉes ยซ mรฉthodeA ยป et ยซ mรฉthodeB ยป. Et la logique รฉtait telle que ยซ mรฉthodeB ยป devait รชtre appelรฉe aprรจs ยซ mรฉthodeA ยป, puis vous enchaรฎneriez l'exรฉcution de telle maniรจre que ยซ mรฉthodeB ยป soit appelรฉe directement aprรจs ยซ mรฉthodeA ยป.)
L'รฉlรฉment clรฉ ร noter dans cet exemple est que le code devient plus propre, lisible et maintenable grรขce ร l'utilisation de promesses imbriquรฉes.
var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';
MongoClient.connect(url)
.then(function(db) {
db.collection('Employee').insertOne({
Employeeid: 4,
EmployeeName: "NewEmployee"
})
.then(function(db1) {
db1.collection('Employee').insertOne({
Employeeid: 5,
EmployeeName: "NewEmployee1"
})
})
});
Explication du code : -
- Nous dรฉfinissons maintenant 2 clauses ยซ then ยป qui sโexรฉcutent lโune aprรจs lโautre. Dans la premiรจre clause then, nous transmettons le paramรจtre 'db' qui contient notre connexion ร la base de donnรฉes. Nous utilisons ensuite la propriรฉtรฉ collection de la connexion 'db' pour insรฉrer des enregistrements dans la collection 'Employee'. La mรฉthode ยซ insertOne ยป est utilisรฉe pour insรฉrer le document rรฉel dans la collection Employee.
- On utilise alors le 2nd clause then รฉgalement pour insรฉrer un autre enregistrement dans la base de donnรฉes.
Si vous vรฉrifiez maintenant le contenu de votre MongoDB base de donnรฉes, vous trouverez les 2 enregistrements insรฉrรฉs dans la MongoDB base de donnรฉes.
Crรฉer une promesse personnalisรฉe
Une promesse personnalisรฉe peut รชtre crรฉรฉe ร l'aide d'un module de nลud appelรฉ ยซ q ยป. La bibliothรจque 'q' doit รชtre tรฉlรฉchargรฉe et installรฉe ร l'aide du gestionnaire de packages de nลuds. Aprรจs avoir utilisรฉ la bibliothรจque 'q', la mรฉthode ยซ denodeify ยป peut รชtre appelรฉe, ce qui fera que n'importe quelle fonction deviendra une fonction qui renvoie une promesse.
Dans l'exemple ci-dessous, nous allons crรฉer une fonction simple appelรฉe ยซ Ajouter ยป qui ajoutera 2 nombres. Nous allons convertir cette fonction en fonction pour renvoyer une promesse.
Une fois cela fait, nous utiliserons la promesse renvoyรฉe par la fonction Add pour afficher un message dans le console.log.
Suivons les รฉtapes ci-dessous pour crรฉer notre fonction personnalisรฉe afin de renvoyer une promesse.
รtape 1) Installation des modules NPM
Pour utiliser ยซ q ยป depuis une application Node JS, le module ยซ q ยป est requis. Pour installer le module 'q', exรฉcutez la commande ci-dessous
npm installer q
รtape 2) Dรฉfinissez le code suivant qui sera utilisรฉ pour crรฉer la promesse personnalisรฉe.
Explication du code : -
- Le premier bit consiste ร inclure la bibliothรจque 'q' en utilisant le mot-clรฉ require. En utilisant cette bibliothรจque, nous pourrons dรฉfinir n'importe quelle fonction pour renvoyer un rappel.
- Nous crรฉons une fonction appelรฉe Add qui ajoutera 2 nombres dรฉfinis dans les variables a et b. La somme de ces valeurs sera stockรฉe dans la variable c.
- Nous utilisons ensuite la bibliothรจque q pour dรฉdรฉifier (la mรฉthode utilisรฉe pour convertir n'importe quelle fonction en fonction qui renverrait une promesse) notre fonction Add ou autrement convertir notre fonction Add en une fonction qui renvoie une promesse.
- Nous appelons maintenant notre fonction ยซ Ajouter ยป et sommes en mesure d'obtenir une valeur promise de retour grรขce ร l'รฉtape prรฉcรฉdente que nous avons effectuรฉe pour dรฉnodรฉifier la fonction Ajouter.
- Le mot-clรฉ 'then' est utilisรฉ pour spรฉcifier que si la fonction est exรฉcutรฉe avec succรจs, affichez la chaรฎne ยซ Fonction d'ajout terminรฉe ยป dans le console.log.
Lorsque le code ci-dessus est exรฉcutรฉ, la sortie ยซ Fonction d'ajout terminรฉe ยป sera affichรฉe dans le console.log comme indiquรฉ ci-dessous.
Rรฉsumรฉ
- L'utilisation de fonctions de rappel dans Node.js prรฉsente des inconvรฉnients. Parfois, au cours du processus de dรฉveloppement, l'utilisation imbriquรฉe de fonctions de rappel peut rendre le code plus compliquรฉ et difficile ร maintenir.
- La plupart des problรจmes liรฉs aux fonctions de rappel imbriquรฉes peuvent รชtre attรฉnuรฉs grรขce ร l'utilisation de promesses et de gรฉnรฉrateurs dans node.js
- Une Promesse est une valeur renvoyรฉe par une fonction asynchrone pour indiquer la fin du traitement effectuรฉ par la fonction asynchrone.
- Les promesses peuvent รชtre imbriquรฉes les unes dans les autres pour rendre le code plus beau et plus facile ร maintenir lorsqu'une fonction asynchrone doit รชtre appelรฉe aprรจs une autre fonction asynchrone.





