J.B. Dadet DIASOLUKA Luyalu Nzoyifuanga JA V ASCRIPT (ProgrammationInternet)VOL. XXIII +243 - 851278216 - 899508675 - 995624714 - 902263541 - 813572818 [email protected] INTRODUCTION : L'objet "Promise" (EcmaScript 6, 2015), facilite la programmation asynchrone (multithreading) : le déroulement du programme se poursuit pendant que les opérations asynchrones tournent aussi. L’objet Promise fonctionne en mode «use strict» ou pas. Le principe de fonctionnement est le suivant : La définition (ou construction) de la fonction (ou objet) Promise définit en paramètre la fonction asynchrone [à exécuter au moment de son appel] qui est un CALLBACK. Cette fonction asynchrone (Promise) a deux paramètres, le premier paramètre sera exécuté en cas de réussite (=resolve) pour passer un argument à la méthode « then ». Le deuxième paramètre sera exécuté en cas d'échec (=reject) pour passer son argument à la méthode « then ». Le paramètre ainsi retenu de la fonction Promise passera donc son argument à la méthode "then" (de la fonction Promise) dans l'appel . Si le premier argument n’est pas utile il faut tout bonnement le baptiser « undefined » on ne peut pas laisser la place du premier paramètre vide. La méthode « then » peut donc prendre tout au plus deux arguments facultatifs (qui son des CALLBACKs), le premier exécutant si Réussite (selon l’argument du premier paramètre de Promise), et le deuxième argument de « then » si Échec (selon l’argument du deuxième paramètre de Promise). Si le premier argument n’est pas utile il faut tout bonnement le baptiser « undefined » on ne peut pas laisser la place du premier paramètre vide. La méthode « then » passe une valeur à une éventuelle deuxième « then » via la directive « return ». Le pseudo-code générique d’une Promise est : var promise = new Promise(function(successf, failf) { // Tache pouvant bien être async if (/* Quand absolument TOUT a bien marché */) { successf("msg succès"); } else { // Une ou plusieurs autres choses ont crashé failf(Error("msg échec")); // objet « Error » J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII } }); « successf » et « failf » peuvent être soient des pointeurs sur fonction (comme ci-dessus) ou des fonctions [développées] inline = in situ. Une autre syntaxe : var promise = new Promise(psuccessf, pfailf) .then( // Notez le point function(pResponse) { console.dir("OK!", pResponse); } , // Notez la virgule function(erreur) { console.dir("KO!", erreur); } ) Au lieu d’utiliser le deuxième paramètre de « then » comme fonction de non succès (= fonction d’erreur), on peut se servir de « catch » après le « then », et précédé d’un point au lieu de la virgule : var promise = new Promise(psuccessf, pfailf) .then( // Notez le point function(pResponse) { console.dir("OK!", pResponse); } ) // Notez le point .catch(function(erreur) { console.dir("KO!", erreur); }) Mais ce dernier code équivaut plus à ceci : var promise = new Promise(psuccessf, pfailf) .then( // Notez le point function(pResponse) { console.dir("OK!", pResponse); } ) // Notez toujours le point avant then .then(undefined,function(erreur) { console.dir("KO!", erreur); }) Promesse (Promise) - 2/7 am) dimanche, 21. octobre 2018 (10:00 J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII Une Promise peut être : 1. 2. 3. 4. fulfilled rejected pending settled - Réussie - Échec - En cours d’exécution/évaluation - Achevée (fulfilled ou rejected). EXEMPLE 1 : <script> "use strict"; var promise = new Promise(function(fptrOK, fptrFail) { fptrOK("ARGUMENT DU CALLBACK DE THEN"); }); promise.then(function(Arg_du_CALLBACK_de_then) { console.dir(Arg_du_CALLBACK_de_then); return "Ce then retourne " + Arg_du_CALLBACK_de_then + " au then qui suit"; }) . then(function(retval_du_then_precedent) { console.dir(retval_du_then_precedent); }) </script> EXEMPLE 2 : <script type="text/javascript"> "use strict"; // Définition de la fonction Promise "fpromise" // "ppromise" = adresse fonction à exécuter par fpromise const fpromise = new Promise(ppromise); // Les deux Paramètres de fpromise ou ppromise : // fonction "siResolue" = si succès // fonction "siEchec" = si pas résolue var d, x function ppromise(siResolue, siEchec) { d=new Date(); x=siResolue // "x" = alias de "siResolue" setTimeout(fsettimeout, 3000); } Promesse (Promise) - 3/7 am) dimanche, 21. octobre 2018 (10:00 J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII // La fonction de setTimeout. // Prend l'adresse de siResolue à la ligne 15. function fsettimeout(){ x('"Promise1" résolue après '+(new Date()-d)+' ms.') } // // // // // // // // // // // // // // Etape finale. A la ligne 45, La fonction "disp" qui fait suite à "fpromise" via l'argument de la méthode "then" de Promise, au point d'entrée, et appelée à la ligne 51, reçoit la valeur de son argument disp du paramètre "siResolue" de la fonction "ppromise" (stockée en alias dans la variable-fonction x à la ligne 15 qui prend son argument à la ligne 24, et déclarée comme variable globale à la ligne 12), la fonction "ppromise" étant appelée par la fonction fpromise (la promesse). siResolue et siEchec (ici dans "x") représentent l'une des valeurs [retournées par] la Promise. function disp(t){ console.dir(t) console.dir(fpromise) } // Point d'entrée. fpromise.then(disp) // "Promise" résolue après 3000 ms (entre 3000 et 3017). console.dir("Waiting1 ...") console.dir(fpromise) </script> EXEMPLE 3 : Une façon compacte d'écrire ce même code : <script type="text/javascript"> "use strict"; const fpromisec = new Promise ( function(ifResolved, ifFail ) { const d=new Date(); setTimeout ( function () { ifResolved('"Promise2" résolved after '+(new Date()-d)+' ms.') } , 3000 ); }); Promesse (Promise) - 4/7 am) dimanche, 21. octobre 2018 (10:00 J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII // Point d'entrée fpromisec.then(function(t){ console.dir(t) console.dir(fpromisec) }) // "Promise" résolue après 3000 ms. console.dir("Waiting2 ...") console.dir(fpromisec) </script> AFFICHAGE DE LA VERSION COMPACTE : AVEC YANDEX VERSION 18.9.1.464 BETA : test.html:50 Waiting1 ... test.html:51 Promise {<pending>} __proto__: Promise [[PromiseStatus]]: "resolved" [[PromiseValue]]: ""Promise1" résolue après 3003 ms." test.html:74 Waiting2 ... test.html:75 Promise {<pending>} __proto__: Promise [[PromiseStatus]]: "resolved" [[PromiseValue]]: ""Promise2" résolved after 3009 ms." test.html:41 test.html:69 "Promise1" résolue après 3003 ms. "Promise2" résolved after 3009 ms. ++++++++++==========++++++++++ AVEC FIRFOX QUANTUM 62.0.2 : Waiting1 ... Promise { <state>: "pending" } test.html:51:1 test.html:52:1 Waiting2 ... Promise { "pending" } <state>: "pending" <prototype>: PromiseProto { … } test.html:76:1 test.html:77:1 "Promise1" résolue après 3002 ms. test.html:41:7 Promise { <state>: "fulfilled", <value>: "\"Promise1\" résolue après 3002 ms." } test.html:42:4 "Promise2" résolved after 3012 ms. Promise { "fulfilled" } <state>: "fulfilled" Promesse (Promise) - 5/7 am) test.html:70:7 dimanche, 21. octobre 2018 (10:00 J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII <value>: "\"Promise2\" résolved after 3012 ms." <prototype>: PromiseProto catch: function catch() constructor: function Promise() finally: function finally() then: function then() Symbol(Symbol.toStringTag): "Promise" <prototype>: Object { … } <prototype>: {…} __defineGetter__: function __defineGetter__() __defineSetter__: function __defineSetter__() __lookupGetter__: function __lookupGetter__() __lookupSetter__: function __lookupSetter__() constructor: function Object() hasOwnProperty: function hasOwnProperty() isPrototypeOf: function isPrototypeOf() propertyIsEnumerable: function propertyIsEnumerable() toLocaleString: function toLocaleString() toSource: function toSource() toString: function toString() valueOf: function valueOf() On peut tester en une seule opération plusieurs [une array de] Promises (processus) avec une array de Promises. Les résultats de cette array de Promises servira aussi comme paramètre du CALLBACK de then qui suit. <script> "use strict"; Promise.all([false,true,false,true]).then(function(arrayDesResultats) { console.dir(arrayDesResultats) }) // Array(4) […] // 0: false // 1: true // 2: false // 3: true // length: 4 // <prototype>: Array [] </script> Mots-clés : Promise, Promise.all, Promise.race, Promise.reject, Promise.resolve, promise.catch, resolve, reject, fulfilled, rejected, pending, settled, tâche, asynchrone, réussite, échec, multithreading, Javascript, curryng, fonction englobante, fonction imbriquée, opération, fonction, ECMA. Promesse (Promise) - 6/7 am) dimanche, 21. octobre 2018 (10:00 J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII D IA SO LU K AN z. Luyalu Docteur en Médecine, Chirurgie & Accouchements (1977), CNOM : 0866 - Spécialiste en ophtalmologie (1980) Études humanités : Scientifique - Mathématiques & Physique. Informaticien-amateur, Programmeur et WebMaster. Chercheur indépendant, autonome et autofinancé, bénévole, sans aucun conflit d’intérêt ou liens d'intérêts ou contrainte promotionnelle avec qui qu’il soit ou quelqu’organisme ou institution / organisation que ce soit, étatique, paraétatique ou privé, industriel ou commercial en relation avec le sujet présenté. +243 - 851278216 - 899508675 - 991239212 - 902263541 - 813572818 [email protected] Promesse (Promise) - 7/7 am) dimanche, 21. octobre 2018 (10:00