This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
api_request= require ('api_request') | |
## definition de la fonction | |
get_le_stock = ( lacle ) -> | |
console.log("le debut fonction") | |
r2 = new api_request('http', 'localhost', 8888) | |
url = '/getValue?cle=' + lacle; | |
r2.with_content_type('application/json') | |
.get( url ).on('reply', | |
(reply, res) -> | |
console.log('LA REPONSE DU GET:') | |
console.log( reply ) | |
#console.log( 'suite') | |
#console.log( res.statusCode ) | |
) | |
## programme principal | |
console.log("Lancement du programme") | |
for x in [0..4] | |
get_le_stock("cle#{x}") | |
---------------------------------------------------- | |
## sortie console ### | |
---------------------------------------------------- | |
node essaiget.js | |
Lancement du programme | |
le debut fonction | |
le debut fonction | |
le debut fonction | |
le debut fonction | |
le debut fonction | |
LA REPONSE DU GET: | |
{ result: 'reponse', forcle: 'cle4' } | |
LA REPONSE DU GET: | |
{ result: 'reponse', forcle: 'cle3' } | |
LA REPONSE DU GET: | |
{ result: 'reponse', forcle: 'cle2' } | |
LA REPONSE DU GET: | |
{ result: 'reponse', forcle: 'cle0' } | |
LA REPONSE DU GET: | |
{ result: 'reponse', forcle: 'cle1' } | |
L’exécution de programme montre bien l'aspect asynchrone des requêtes : La boucle 'for' est exécutée sans interruption (les lignes : début de fonction) , puis Node commence à envoyer les requêtes au serveur Nosql dans un ordre qui n'est pas celui de la boucle. Il commence par la 'clé 4' . Avec une boucle plus grande (ex : 100) on retrouve cette 'clé 4' en première requête. Cette valeur peut changer sur une autre machine. Pendant la boucle for , le gestionnaire d’évènement se contente de stocker les demandes, puis en fonction de son cycle interne , profite des interruptions pour réaliser les requêtes. Avec une boucle de 100 requêtes, les 10 premières sont en vrac puis le système se régule. Dans un système asynchrone, la fonction appelée retourne un callback (fonction de retour) et se termine. Ce callback sera appelé lors de la réalisation de l’évènement associé.
Il existe des moyens pour enchaîner des actions synchrones dans un univers asynchrone (ce n'est pas une aberration) . Le callback doit prévoir cet enchainement d'action.
exemple :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
get_le_stockSync = ( lacle,max ) -> | |
return if lacle > max | |
console.log("le debut fonction: #{lacle}") | |
r2 = new api_request('http', 'localhost', 8888) | |
url = '/getValue?cle=' + lacle; | |
r2.with_content_type('application/json') | |
.get( url ).on('reply', | |
(reply, res) -> | |
console.log('LA REPONSE DU GET SYNC:',reply) | |
# console.log( 'suite') | |
# console.log( res.statusCode ) | |
get_le_stockSync(lacle+1,max) | |
) | |
# appel fonction | |
get_le_stockSync(0,20) | |
### sortie console #### | |
Lancement du programme | |
le debut fonction: 0 | |
LA REPONSE DU GET SYNC: { result: 'reponse', forcle: '0' } | |
le debut fonction: 1 | |
LA REPONSE DU GET SYNC: { result: 'reponse', forcle: '1' } | |
le debut fonction: 2 | |
LA REPONSE DU GET SYNC: { result: 'reponse', forcle: '2' } | |
le debut fonction: 3 |
La fonction de callback fait un appel récursif tout en incrémentant la clé. A la réception de réponse du serveur, un évènement sera déclenché. La fonction callback associée à la réalisation de l'évènement sera appelé et cette fonction fournira l’enchaînement suivant. On utilise dans cet exemple des techniques de programmation fonctionnelle, ce n'est pas un hasard. Les fonctions callback se déclenchent dans un temps incertain et surtout avec des variables globales dans un état lui aussi incertain. La programmation fonctionnelle donne des modes de résolution pour ce type de problème avec des variables partagée.
Aucun commentaire:
Enregistrer un commentaire