Académique Documents
Professionnel Documents
Culture Documents
PROMISE (PROMESSES),
Async / await
J AVA S C R I P T (Programmation Internet)
VOL. XXIII
asyncFunc()
.then(result => { ··· })
.catch(error => { ··· });
.finally(result | error => { ··· });
function asyncFuncEchec() {
const eventEmitter = { reussi: [] , echec: [] };
Promise-Promesse & async-await -2/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
// Hash ayant 2 Arrays vides
setTimeout(() => {
for (const i of eventEmitter.echec) {
i('Timeout dépassé');
}
}, 5000); // 5 secondes
return eventEmitter;
// Retourne « eventEmitter = { reussi: [] , echec: [] } »
}
console.log(r["reussi"]); // Array [ () ]
console.log(r); // Object { reussi: (1) […] }
//////////////////////////////////////////////////
console.log("\n\n/* II. EVENT EMITTER - ÉCHEC */");
//////////////////////////////////////////////////
function asyncFuncReussite() {
const eventEmitter = { reussi: [] , echec: [] };
// Hash ayant 2 Arrays vides
setTimeout(() => {
for (const i of eventEmitter.reussi) {
i('Timeout accpmpli');
}
}, 1000); // 1 seconde
return eventEmitter;
// Retourne « eventEmitter = { reussi: [] , echec: [] } »
}
Avec « Promise() » :
};
console.log("Entry point"
.padStart(16,".")
.padEnd(21,"."));
fAsync()
. then(function(res) {
console.log(res);
console.log("La FIN"
.padStart(11,"=")
.padEnd(16,"="));
})
console.log("La suite...");
</script>
};
console.log("Entry point"
.padStart(16,".")
.padEnd(21,"."));
fAsync()
. then(function(res) {
console.log(res);
console.log("La FIN"
.padStart(11,"=")
.padEnd(16,"="));
})
console.log("La suite...");
</script>
let res;
/* async */ function fAsync() {
console.log("! Preparing to await !");
/* await */ fProcess();
res = "x".repeat(5);
}
console.log("...Entry point");
fAsync()
// . then(function(res) {
console.log(res);
// })
console.log("La suite...");
</script>
Exécutioin :
. ! . Attention . ! .
Promise-Promesse & async-await -11/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
window.setTimeout()
console.log("...Entry point");
fAsync(3)
. then(function(res) {
console.log(res);
})
console.log("La suite...");
</script>
fAsync(3)
. then(function(res) {
console.log(res);
})
console.log("La suite...");
return "x".repeat(5);
fAsync(3)
. then(function(res) {
console.log(res);
})
console.log(
"Fini l'attente de "+
(new Date()-st)/1000 + " secondes."
);
/**/ temporiser(5).then(function () {
/**/ console.log(
/**/ `${(new Date() - st)/1000} secondes passées`
/**/ );
/**/ });
Soit, passons.
function retarder(delai){
d = new Date();
return new Promise(function(resolve) {
setTimeout(function () {
resolve()
}, delai*1000);
})
}
await retarder(p)
Promise-Promesse & async-await -15/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
go(2).then(function(retVal) {
console.log(retVal);
})
</script>
Exécution :
En pause de 2 secondes...
test.html:26 2.013 secondes révolues
<script type="text/javascript">
"use strict";
Promise
.resolve("Promesse Résolue")
.then(x => console.log(x));
// => Promesse Résolue
Promise
.reject("Promesse Rejetée")
.catch(x => console.log(x));
// => Promesse Rejetée
</script>
pr
.then(function(res){
console.log(res);
})
.catch(function(rej){
console.log(rej);
})
.finally(function(res,rej){
console.log(`** Qq soit l'issu de promise`);
console.log(`res = ${res} , ` , "rej = ",rej);
});
pr
.then(function(res){
console.log(res);
})
.catch(function(rej){
console.log(rej);
})
.finally(function(res,rej){
console.log(`** Qq soit l'issu de promise`);
console.log(`res = ${res} , ` , "rej = ",rej);
});
})
.catch(function (reason) {
console.log(`${reason}, in .catch()`);
console.log(reason + ", in .catch()");
console.log(reason," in .catch()");
});
</script>
Avec Firefox :
Avec Yandex :
pr
.then(function(res){
console.log(res);
})
.catch(function(rej){
console.log(rej);
})
.finally(function(res,rej){
console.log(`** Qq soit l'issu de promise`);
console.log(`res = ${res} , ` , "rej = ",rej);
});
pr
.then(null, error => {
console.log("Dans « .then(null...) »");
console.log(null);
})
.catch(rej => {
console.log(
"Dans « .catch() recevant « null »)" ,
"Ce « .catch() » ne sera jamais exécuté)"
);
console.log(rej)
})
.finally(function(res,rej){
console.log(`** Qq soit l'issu de Promise`);
console.log(`res = ${res} , ` , "rej = ",rej);
});
EXEMPLE 2 :
pr
.then(function(res){
console.log(res);
})
.catch(function(rej){
console.log(rej);
})
.finally(function(res,rej){
console.log(`** Qq soit l'issu de promise`);
console.log(`res = ${res} , ` , "rej = ",rej);
});
Exécution :
EXEMPLE 3 :
C’est plus clair comme ceci, donc plus facile à déboguer = com-
prendre et entretenir :
pr . then(fresolve) . catch(freject);
Exécution :
let f = _ => {
var r;
return new Promise(
function(resolve , reject) {
(r = (Math.random()*10)) > 5
?
resolve(r+" > 5")
:
reject(r+" <= 5")
}
)
}
let pr = f()
pr . then(fresolve) . catch(freject);
Exécution :
Sachez que les méthodes .then et .catch sont aussi des Promises.
Leur callback (fonction-argument) reçoit la valeur retournée par la
promise précédente (soit le corps de la définition de la Promise, soit
une autre .then ou .catch). Chaque méthode .then ou .catch retourne
aussi une valeur au paramètre de la .then ou .catch qui sera exécutée
après elle.
if (aleat > 0) {
let ast="";
var result = c / aleat;
if(!(result%1))ast="*".repeat(5)
ok({aleat, result, ast});
} else {
ko(new Error("Division par 0!"));
}
let cptr=0;
let int = setInterval(() =>
diviseurs()
.
then((data) => { // Si OK
console.log(++cptr+". "+c," divisé par",
data.aleat, "=", data.result, data.ast);
if(cptr==100)clearInterval(int);
})
.
catch((err) => { // Si erreur
console.log(err);
})
, 100 /* à intervalle régulier (1/10e sec). */);
</script>
Avec Yandex :
console.log(pr);
pr.then(function(resolve){
console.log("dans le 1er .then");
return resolve + "En ~"
}).then(function(resolve){
console.log(
"La suite ... Patientez ~"+delai/1000+" secs.");
</script>
Exécution :
Avec Firefox :
Avec Yandex :
et
let a=Math.round(Math.random()*2100);
asyncFunc1(a)
.then(resolvAsynFunc1 => {
return resolvAsynFunc1;
})
.then(resThen => {
console.log(a," => ",resThen," Année Bisextile");
})
.catch(error => {
console.log(new Error(error+" : Non Bissextile"));
});
</SCRIPT>
let a=Math.round(Math.random()*2100);
// TRAITEMENTS APPROFONDIS.
fAsync.then(resolvAsynFunc1 => {
return resolvAsynFunc1;
})
.then(resThen => {
console.log(a," => ",resThen,
" Année Bisextile (FULL TREATMENT)");
})
.catch(error => {
console.log(new Error(error +
" : Non Bissextile (FULL TREATMENT)"));
});
</SCRIPT>
Avec Yandex :
Chaînage de « Promises » :
Mais à elles seules, il n’est pas possible de chaîner facilement [et sur-
tout clairement] en une seule instruction, les opérations qui doivent
nécessairement s’attendre l’une l’autre, et le codage devient lourd et
confus.
// console.log(pr);
// pr.then(function(resolve){
function f(resolve){
console.log("Ici était le 1er .then");
f1(resolve + " En ~");
}
// }).then(function(resolve){
function f1(resolve){
console.log("Ici était le 2è .then");
f2(resolve);
// }).then(function(resolve){
}
function f2(resolve){
console.log("Ici était le 3è .then");
let t = (new Date()-d)/1000;
console.log(resolve+t+" secs.");
}
// });
console.log(
"La suite ... Patientez ~"+delai/1000+" secs.");
</script>
// console.log(pr);
// pr.then(function(resolve){
function f(resolve){
console.log("Ici était le 1er .then");
f1(resolve + " En ~");
}
// }).then(function(resolve){
function f1(resolve){
console.log("Ici était le 2è .then");
f2(resolve);
// }).then(function(resolve){
}
function f2(resolve){
console.log("Ici était le 3è .then");
let t = (new Date()-d)/1000;
console.log(resolve+t+" secs.");
}
// });
console.log(
"La suite ... Patientez ~"+delai/1000+" secs.");
</script>
Exécution :
Pour mieux se figurer une Promise, ça rappelle dans une certain me-
sure l’instruction inkey$ de notre beau vieux GW-Basic du MS-DOS,
et la commande PRINT de la ligne de commande du MS-DOS qui
imprime le document proposé, pendant que toutes les autres tâches
continuent à se dérouler comme si rien n’était.
Chaînage de Promises 2 :
function asyncFunc1() {
return new Promise(
function (resolve, reject) {
resolve("Réussi asyncFunc1");
reject(error);
});
}
asyncFunc1()
.then(resolvAsynFunc1 => {
console.log(resolvAsynFunc1);
return asyncFunc2();
})
.then(resolvAsynFunc2 => {
console.log(resolvAsynFunc2);
})
.catch(error => {
console.log(error);
});
</SCRIPT>
En libérant l’instruction
//resolve("Réussi asyncFunc2");
dans
<br><br>(DOWN)<br>Tapez un caractère
<input id="d" onkeydown="f2(value)">
<br><br>(PRESS)<br>Tapez un caractère
<input id="p" onkeypress="f3(value)">
function f2(p){
console.log(p);
Promise-Promesse & async-await -37/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
console.log(document.getElementById('d').value);
document.getElementById('d').value=""
}
function f3(p){
console.log(p);
console.log(document.getElementById('p').value);
document.getElementById('p').value=""
}
</script>
Exécution de ce polyfill :
II. Notez que « onkeydown » prend ici la valeur (texte) qui était
dans la fenêtre « input » AVANT d'avoir tapé la dernière
touche, et non pas après l’avoir tapée.
III. Notez que « onkeypress » aussi, prend ici la valeur (texte) qui
était dans la fenêtre « input » AVANT d'avoir tapé la dernière
touche, et non pas après l’avoir tapée.
THEN =
Si la tâche qui précède s’achève ALORS exécutez (passez à) cette
fonction qui suit, avec comme argument la valeur retournée par la
précédente qui se comporte aussi comme une Promise.
asyncFunc(5)
.then(r => console.log(r))
.catch(erreur => console.log(erreur))
.finally(console.log("Finally"));
</script>
Avce asyncFunc(5)
Avce asyncFunc(6)
Avce asyncFunc(autre)
Donc :
N.B. :
La méthode « then » peut donc prendre tout au plus un des deux ar-
guments facultatifs (qui sont des CALLBACKs aussi), le premier
exécutant s’il y a eu Réussite (selon l’argument du premier paramètre
de Promise), et le deuxième argument de « then » s’il y a eu Échec
(selon l’argument du deuxième paramètre de Promise).
// ou
function(rejectParam) {
console.dir("KO=FAIL=REJECTED!",
rejectParam);
}
)
console.log(promise);
console.log("la suite");
}
</script>
Exécution :
Notez que l’exécution n’est pas exactement la même dans les deux
browsers, et que Promise a exécuté après les instructions qui viennent
après elle.
la suite test.html:33:3
la suite test.html:33:3
promise file:///K:/DADET/PROGS/test.html:13:17
fgo file:///K:/DADET/PROGS/test.html:11:17
onchange file:///K:/DADET/PROGS/test.html:1:1
la suite test.html:33:3
OK=SUCCESS=FULFILLED! YES!
543,869,1463,2168,1734,1664,598,425,932,1476 > 100
test.html:19:7
test.html:33 la suite
test.html:19 OK=SUCCESS=FULFILLED!
test.html:33 la suite
test.html:28 KO=FAIL=REJECTED!
on peut faire
Voyons-ça :
then(
undefined
,
function(rejectParam) {
console.dir("KO=FAIL=REJECTED!", rejectParam);
}
)
// ou
// then(undefined,function(rejectParam) {
// console.dir("KO=FAIL=REJECTED!", rejectParam);
// }
console.log(promise);
console.log("la suite");
</script>
la suite test.html:35:1
Illustration :
console.log(promise);
console.log("la suite");
</script>
la suite test.html:30:1
console.log(vpromise);
vpromise.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>
Exécution :
Promise {
<state>: "fulfilled",
<value>: "ARGUMENT DU CALLBACK DE THEN" }
test.html:7:1
console.log(vpromise);
vpromise
.
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>
test.html:7
1. Promise {<rejected>: "ARGUMENT DU CALLBACK DE THEN"}
1. __proto__: Promise
Promise-Promesse & async-await -51/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
2. [[PromiseStatus]]: "rejected"
3. [[PromiseValue]]: "ARGUMENT DU CALLBACK DE THEN"
Promise { "rejected" }
<state>: "rejected"
<reason>: "ARGUMENT DU CALLBACK DE THEN"
<prototype>: PromiseProto { … } test.html:7:1
EXEMPLE 6 :
reussi
.then(result => pReussite(result))
.catch(erreur => pEchec(erreur))
echec
.then(result => pReussite(result))
.catch(erreur => pEchec(erreur))
Exécution :
17:53:17.960 test.html:20
Promesse OK a retourné/passé : +++ret_OK+++
17:53:17.964 test.html:23
Promesse KO a retourné/passé : ---ret_Erreur---
EXEMPLE 7 :
console.log(vpromise);
vpromise
.
then(function(Arg_du_CALLBACK_de_then) {
console.dir(Arg_du_CALLBACK_de_then);
return "Ce then retourne « " +
Arg_du_CALLBACK_de_then +
Promise-Promesse & async-await -53/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
" » au then suivant";
})
.
then(function(retval_du_then_precedent) {
console.dir(retval_du_then_precedent);
})
</script>
Promise {
<state>: "fulfilled", <value>: "1,2,3 contains 2" }
test.html:10:1
1,2,3 contains 2
test.html:15:3
Dans Firefox :
Promise { "rejected" }
<state>: "rejected"
<reason>: Error: "5 not in 1,2,3"
Vpromise file:///K:/DADET/PROGS/test.html:7:15
<anonymous> file:///K:/DADET/PROGS/test.html:5:16
<prototype>: PromiseProto { … }
Dans Yandex :
test.html:10 Promise {
<rejected>: Error: 5 not in 1,2,3
at file:///K:/DADET/PROGS/test.html:7:15
at new Promise (<anonymous>)
Promise-Promesse & async-await -54/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
…}
test.html:10 Promise {
<rejected>: Error: 5 not in 1,2,3
at file:///K:/DADET/PROGS/test.html:7:15
at new Promise (<anonymous>)
…}
__proto__: Promise
[[PromiseStatus]]: "rejected"
[[PromiseValue]]: Error: 5 not in 1,2,3
at file:///K:/DADET/PROGS/test.html:7:15
at new Promise (<anonymous>)
at file:///K:/DADET/PROGS/test.html:5:16
test.html:7 Uncaught (in promise) Error: 5 not in 1,2,3
EXEMPLE 8 :
console.log(vpromise);
vpromise
. // Point
then(
function(Arg_du_CALLBACK_de_then) {
console.dir(Arg_du_CALLBACK_de_then);
return "Ce then retourne RESOLVE « " +
Arg_du_CALLBACK_de_then +
Dans Yandex :
test.html:16
1,2,3 contains 2
test.html:31
Ce then retourne RESOLVE « 1,2,3 contains 2 » au then sui-
vant
test.html:10
Promise {<resolved>: "1,2,3 contains 2"}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: "1,2,3 contains 2"
test.html:16
1,2,3 contains 2
test.html:31
Ce then retourne RESOLVE « 1,2,3 contains 2 » au then
suivant
Dans Firefox :
Promise {
<state>: "fulfilled", <value>: "1,2,3 contains 2" }
test.html:10:1
1,2,3 contains 2
test.html:16:5
Promise { "fulfilled" }
<state>: "fulfilled"
1,2,3 contains 2
test.html:16:5
EXEMPLE 9 :
console.log(vpromise);
vpromise.then(fresolve , freject).then(fretval)
function fresolve(Arg_du_resolve){
console.dir(Arg_du_resolve);
return "Ce then retourne RESOLVE « " +
Arg_du_resolve +
" » au then suivant";
}
</script>
EXEMPLE 10 :
vpromise.then(fresolve).catch(freject)
console.log(vpromise);
vpromise.then(fresolve).catch(freject).then(fretval)
function fresolve(Arg_du_resolve){
console.dir(Arg_du_resolve);
return "Ce then retourne RESOLVE « " +
Arg_du_resolve +
" » au then suivant";
}
</script>
Dans Yandex :
test.html:21
Promise {<rejected>: Error: 23 not in 1,2,3
at file:///K:/DADET/PROGS/test.html:18:15
at new Promise (<anonymous>…}
test.html:13
Ce then retourne REJECT « Error: 23 not in 1,2,3 » au
then suivant
Dans Firefox :
EXEMPLE 11 :
promise
.then(
function(resolve,reject) {
let v1 = "v1 = "+resolve;
console.log(v1);
const ps=" "+v1+" | "
return("RETURN"+ps);
// resolve("RESOLVE"+ps);
// reject("REJECT"+ps);
}
)
.then(function(resolve,reject) {
let v2 = new Error("v2 = "+resolve+" § ");
console.log(v2);
return(v2);
}
)
.catch(function(reject) {
let v3 = new Error("v3 = "+reject+" $ ");
console.log(v3);
return(v3);
}
)
.then(function(resolve,reject) {
let v4 = "** v4 ** "+resolve+" £ ";
console.log(v4);
return "RESOLVE v4 = "+v4;
}
)
.catch(function(reject) {
let v5 = "### "+new Error("v5 = "+reject) +
" ###";
console.log(v5);
return v5;
}
)
</script>
Promise {
<state>: "fulfilled", <value>: "<<< OK 123 >>>" }
<state>: "fulfilled"
<value>: "<<< OK 123 >>>"
<prototype>: PromiseProto { … }
test.html:51:1
EXEMPLE 12 :
var d, x
function ppromise(siResolue, siEchec) {
d=new Date();
x=siResolue // "x" = alias de "siResolue"
setTimeout(fsettimeout, 3000);
}
// 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.
// Point d'entrée.
fpromise.then(disp)
console.dir("Waiting1 ...")
console.dir(fpromise)
</script>
EXEMPLE 13 :
function testArray(p) {
// Cette fonction retourne une Promise
// Les deux paramètres de notre Promise sont
// baptisés ici «resolve» et «reject».
else (function() {
reject(new Error(p+' pas dans ' +a));
})();
// Une Promise rejetée est en état "rejected"
});
// Indifféremment la Promise est en état "settled".
}
let r = testArray(23);
Exécution :
Message d'erreur :
test.html:16
Uncaught (in promise) Error: 23 pas dans 1,2,3
Affichage :
test.html:24
Promise {<rejected>: Error: 23 pas dans 1,2,3
__proto__: Promise
[[PromiseStatus]]: "rejected"
[[PromiseValue]]: Error: 23 pas dans 1,2,3
Message d'erreur :
Affichage :
Affichage :
Promise {<resolved>: "2 dans 1,2,3"}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: "2 dans 1,2,3"
Affichage :
EXEMPLE 14 :
img.onload = function() {
resolve(img);
// Paramètre img renvoyé si le chargement a
// réussi "fulfilled".
// Change l’état de la Promise en « resolved »
};
img.onerror = function() {
reject(new Error('Could not load image at ' +
url));
// Etat de l'erreur renvoyé si le chargement
// a échoué "rejected"
// Change l’état de la Promise en « rejected »
};
});
}
const r=loadImg("http://fai.dom");
console.log(r)
console.log("la suite")
</script>
Exécution :
Avec Yandex:
test.html:25
Promise-Promesse & async-await -67/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
Promise {<pending>}
test.html:26
la suite
fai.ext/:1
GET http://fai.dom/ net::ERR_INTERNET_DISCONNECTED
Image (async)
(anonymous) @ test.html:6
loadImg @ test.html:4
(anonymous) @ test.html:24
test.html:16
Uncaught (in promise) Error: Could not load image at
http://fai.dom
at Image.img.onerror (test.html:16)
img.onerror @ test.html:16
error (async)
(anonymous) @ test.html:15
loadImg @ test.html:4
(anonymous) @ test.html:24
Avec Firefox:
la suite test.html:26:1
Error:
Could not load image at http://fai.dom test.html:16:14
EXEMPLE 15 :
// Point d'entrée
fpromisec.then(function(t){
console.dir(t)
console.dir(fpromisec)
})
console.dir("Waiting2 ...")
console.dir(fpromisec)
</script>
++++++++++==========++++++++++
Promise . all :
p2 = new Promise(function(rs,rj){
rs ("p2 résolu")
}),
p3 = new Promise(function(rs,rj){
rs ("p3 résolu")
});
Promise.all([p1,p2,p3])
.then(function(arrayDesResultats) {
console.dir(arrayDesResultats);
Exécution :
Promise.all(
[asyncFunc1(),asyncFunc2(),asyncFunc3()]
)
.then(r => {
console.log(r);
for(let k of r) console.log(k)
})
.catch(err => {
// Premier rejet de toutes les Promises
console.log(err)
})
.finally(console.log("Finally"));
</script>
Promise.all(
[asyncFunc1(),asyncFunc2(),asyncFunc3()]
)
.then(arrayDesResultats => {
console.log(arrayDesResultats);
for(let k of arrayDesResultats) console.log(k)
})
.catch(function(erreur){
console.dir(erreur)
console.dir(erreur.status)
console.dir(new Error(erreur))
console.dir(new Error(erreur.status))
})
.finally(console.log("Finally"));
</script>
EXEMPLE 18 :
if(a.includes(p))(function() {
resolve(p+" dans "+a);
})();
// Une Promise résolue est en état "fulfilled"
else (function() {
reject(new Error(p+' pas dans ' +a));
})();
// Une Promise rejetée est en état "rejected"
});
// Indifféremment la Promise est en état "settled".
}
let r = testArray(12);
console.log(r);
</script>
test.html:24
Promise {<rejected>: Error: 12 pas dans 1,2,3
at file:///K:/DADET/PROGS/test.html:16:15
at file:///K:/DADET/PROGS…}
test.html:16
Uncaught (in promise) Error: 12 pas dans 1,2,3
at test.html:16
at test.html:17
at new Promise (<anonymous>)
at testArray (test.html:7)
at test.html:23
test.html:24
Promise {<rejected>: Error: 12 pas dans 1,2,3
at file:///K:/DADET/PROGS/test.html:16:15
at file:///K:/DADET/PROGS…}
__proto__: Promise
[[PromiseStatus]]: "rejected"
[[PromiseValue]]: Error: 12 pas dans 1,2,3
at file:///K:/DADET/PROGS/test.html:16:15
at file:///K:/DADET/PROGS/test.html:17:8
at new Promise (<anonymous>)
at testArray (file:///K:/DADET/PROGS/test.html:7:11)
at file:///K:/DADET/PROGS/test.html:23:10
test.html:16
Uncaught (in promise) Error: 12 pas dans 1,2,3
at test.html:16
at test.html:17
at new Promise (<anonymous>)
at testArray (test.html:7)
at test.html:23
(anonymous) @ test.html:16
(anonymous) @ test.html:17
testArray @ test.html:7
PROMISE . RACE ( ) :
EXEMPLE 19 :
p2 = new Promise(function(resolve,reject){
reject('"p2 rejeté"')
});
Promise.race([p1,p2])
.then(function(ok) {
console.dir(ok)
})
.
catch(function(erreur){
console.dir(new Error(erreur))
})
</script>
Exécution :
Avec Promise.race([p1,p2])
on a :
Avec Promise.race([p2,p1])
on a :
test.html:16:3
Error: "p2 rejeté"
at file:///K:/DADET/PROGS/test.html:16:15
EXEMPLE 20 :
const p1 = Promise.resolve([1,2,3].includes(3));
p1.then(
result => {
console.log(
"LES DEUX PROMISES [ALL] DANS LE 1e THEN")
console.log(result);
const p2 = Promise.resolve([2,4,6].includes(2));
const p3 = Promise.resolve([3,6,9].includes(6));
return Promise.all([p2,p3]);
}
).then(
retArr =>{
console.log(retArr[0]);
console.log(retArr[1]);
}
)
</script>
p11.then(
result => {
console.log(result);
console.log("***");
return p11;
}
).then(
retVal => {
console.log(
"LES DEUX PROMISES [ALL] DANS LE 2e THEN")
console.log(retVal);
Promise.all([p21,p31]).then(
retArr => {
console.log(retArr[0]);
console.log(retArr[1]);
}
)
}
)
</script>
Exécution :
Promise()
all: function all()
length: 1
name: "Promise"
prototype: PromiseProto { … }
catch: function catch()
constructor: function Promise()
finally: function finally()
then: function then()
Symbol(Symbol.toStringTag): "Promise"
<prototype>: Object { … }
<prototype>: ()
apply: function apply()
arguments: null
bind: function bind()
call: function call()
caller: null
constructor: function Function()
length: 0
Promise-Promesse & async-await -80/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
name: ""
toSource: function toSource()
toString: function toString()
Symbol(Symbol.hasInstance):
function Symbol.hasInstance()
<prototype>: Object { … }
Object.getOwnPropertyDescriptors(Promise)
goAsync(array);
console.log("suite");
</script>
goAsync(array);
console.log("suite");
</script>
var t="";
await (
(function(){
console.log("(5) Ds Async, 2e await " +
" AVANT for...to");
for (let k=0 ; k< 100000 ; k++);
console.log(
"(6) Ds Async, 2e await APRÈS for...to");
}())
// console.log("Ds Async, 2e await");
);
var t="";
console.log(t+
"(8) Ds Async avant 3è await & for...of");
for await (let i of array) {
t += i + " | ";
}
console.log("(9) ",t,
"Ds Async après 3è await & for...of");
}
console.log(`Entry Point`);
asyncFunc();
console.log(`La suite`);
</script>
EXEMPLE 21 :
// VERTSION asyncF
async function fAsync(a,e){
if(a.includes(e)) return a+".includes("+e+")";
else throw a+" .not.includes("+e+")";
}
fPromise(ar , e)
.then(result =>
console.log(`Le Résultat : ${result}`))
.catch(result =>
console.log(`Le Résultat : ${result}`))
fAsync(ar , e)
.then(result =>
console.log(`Le Résultat : ${result}`))
.catch(result =>
console.log(`Le Résultat : ${result}`))
</script>
Exécution avec « e == 3 » :
Les deux codes sans reject ci-dessous sont aussi identiques bien que
pas corrects, et leur fonctionnement n’est pas le même dans Google
Chrome Version 70.0.3538.77 (Build officiel) (64 bits) 2018 que
dans Firefox Quantum 62.0.2.
EXEMPLE 22 :
// VERTSION asyncF
async function fAsync(a,e){
if(a.includes(e)) return a+".includes("+e+")";
else throw a+" .not.includes("+e+")";
}
fPromise(ar , e)
.then(result =>
console.log(`Le Résultat : ${result}`))
fAsync(ar , e)
.then(result =>
console.log(`Le Résultat : ${result}`))
</script>
Exécution :
23:27:35.732 test.html:1
Uncaught (in promise) 1,2,3,4,5 .not.includes(7)
Promise.then (async)
(anonymous) @ test.html:24
23:27:35.735 test.html:1
Uncaught (in promise) 1,2,3,4,5 .not.includes(7)
<script type="text/javascript">
var ar = new Int32Array([100,8000,999,10000,400000 ]);
console.log("Notre array:\n"+ar);
console.log("");
let r;
r = ar.map(chc);
console.log("Chacun des éléments de notre Ar-
ray:\n"+r);
console.log("");
r = ar.filter(impaires);
console.log("Elements impaires: ", r);
r = ar.filter(paires);
console.log("Elements paires: ", r);
</script>
console.log("");
r = ar.every(Callback0);
if(r){
console.log("TOUS les éléments sont <95 :",r);
console.log("r.length =",r.length);
}else {
console.log("Au moins un élément « !(<95) » :",r);
console.log("r.length =",r.length);
}
r = ar.filter(Callback1);
if(r.length){
console.log("Eléments >=95 :",r);
console.log("r.length =",r.length);
}else {
Promise-Promesse & async-await -92/97- dimanche, 24. mars 2019 (12:24 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXIII
console.log("Au moins un élément « !(>=95) » :",r);
console.log("r.length =",r.length);
}
console.log("");
r = ar.every(Callback2);
if(r){
console.log("TOUS les éléments sont <15 :",r);
console.log("r.length =",r.length);
}else {
console.log("Au moins un élément « !(<15) » :",r);
console.log("r.length =",r.length);
}
r = ar.filter(Callback3);
if(r.length){
console.log("Au moins un élément <15 :",r);
}else {
console.log("Aucun élément <15 :",r);
}
console.log("");
r = ar.every(Callback4);
if(r){
console.log("TOUS les éléments sont >=15 :",r);
console.log("r.length =",r.length);
}else {
console.log("Au moins un élément « !(>=15) » :",r);
console.log("r.length =",r.length);
}
r = ar.filter(Callback4);
if(r){
console.log("TOUS les éléments >=15 :",r);
console.log("r.length =",r.length);
}else {
console.log("Au moins un élément « !(>=15) » :",r);
console.log("r.length =",r.length);
}
</script>
Notre Array:
90,57,19,53,75,95,18,15,65,94 test.html:4:4
ar.length = 10 test.html:5:4
return "Nada";
}
console.log("");
let r = ar.forEach(Callback);
// ar.forEach() ne retourne absolument rien !
console.log("Les éléments retournés :",r);
</script>
Notre Array:
90,57,19,53,75,95,18,15,65,94 test.html:3:4
Mots-clés :
async, callback, await, throw, Promise, Promise.all, Promise.race,
Promise.reject, Promise.resolve, promise.catch, resolve, reject, ful-
filled, rejected, pending, settled, tâche, asynchrone, réussite, échec,
multithreading, Javascript, curryng, fonction englobante, fonction
imbriquée, opération, fonction, ECMASCRIPT.
diasfb@mail2world.com