Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
code_language:javascript [2025/11/02 15:34] 74.7.227.242 ancienne révision (2025/11/02 15:13) restaurée |
code_language:javascript [2025/11/02 15:51] (Version actuelle) 74.7.227.242 ancienne révision (2025/11/02 13:06) restaurée |
||
|---|---|---|---|
| Ligne 1571: | Ligne 1571: | ||
| Documentation setTimeout: https:// | Documentation setTimeout: https:// | ||
| - | === Les autres " | + | === Les autres " |
| + | Il existe d' | ||
| + | * setInterval : fonctionne comme " | ||
| + | * Documentation https:// | ||
| + | * setImmediate: | ||
| + | * Documentation: | ||
| + | |||
| + | === Fonction asynchrone par nature === | ||
| + | * Les evenements: Sont toujours exécutés de façon asynchrone. | ||
| + | * Les input/ | ||
| + | * Quelques autres... (callBack, Promise, et les Async/ | ||
| + | |||
| + | === CallBacks === | ||
| + | |||
| + | Une callback est simplement une fonction que vous définissez. Le principe de la callback est de la passer en paramètre d'une fonction asynchrone. Une fois que la fonction asynchrone a fini sa tâche, elle va appeler notre fonction callback en lui passant un résultat. | ||
| + | |||
| + | exemple: | ||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | element.addEventListener(' | ||
| + | // Do something here ... | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | Les callbacks sont faciles à comprendre et à utiliser, mais elles souffrent d'un gros problème de lisibilité du code, via ce qu'on appelle le callback hell. En effet, on se retrouve régulièrement dans des situations où on va imbriquer plusieurs couches de callbacks , rendant le code difficile à lire et pouvant générer des erreurs. | ||
| + | |||
| + | |||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | elt.addEventListener(' | ||
| + | mysql.connect(function(err) { | ||
| + | mysql.query(sql, | ||
| + | fs.readFile(filePath, | ||
| + | mysql.query(sql, | ||
| + | // etc ... | ||
| + | }); | ||
| + | }); | ||
| + | }); | ||
| + | }); | ||
| + | }); | ||
| + | </ | ||
| + | C'est bien beau de gérer du code asynchrone, mais rien ne vous garantit que tout se soit bien passé. Il nous faut donc un mécanisme pour savoir si une erreur est survenue ! | ||
| + | |||
| + | === Gerer les erreurs callbacks === | ||
| + | Pour gérer les erreurs avec les callbacks, la méthode la plus utilisée est de prendre 2 paramètres dans notre callback. Le 2e paramètre est notre donnée et le 1er est l' | ||
| + | |||
| + | Si on reprend l' | ||
| + | |||
| + | exemple: | ||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | fs.readFile(filePath, | ||
| + | if (err) { | ||
| + | throw err; | ||
| + | } | ||
| + | // Do something with data | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | === Promise === | ||
| + | Lorsqu' | ||
| + | |||
| + | Cette promesse est en fait un objet " | ||
| + | |||
| + | Lorsque l'on récupère une " | ||
| + | |||
| + | Exemple: | ||
| + | |||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | functionThatReturnsAPromise() | ||
| + | .then(function(data) { | ||
| + | // Do somthing with data | ||
| + | }) | ||
| + | .catch(function(err) { | ||
| + | // Do something with error | ||
| + | }); | ||
| + | </ | ||
| + | Dans l' | ||
| + | |||
| + | Le gros avantage est que l'on peut aussi chaîner les " | ||
| + | |||
| + | exemple: | ||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | returnAPromiseWithNumber2() | ||
| + | .then(function(data) { // Data is 2 | ||
| + | return data + 1; | ||
| + | }) | ||
| + | .then(function(data) { // Data is 3 | ||
| + | throw new Error(' | ||
| + | }) | ||
| + | .then(function(data) { | ||
| + | // Not executed | ||
| + | }) | ||
| + | .catch(function(err) { | ||
| + | return 5; | ||
| + | }) | ||
| + | .then(function(data) { // Data is 5 | ||
| + | // Do something | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | Dans l' | ||
| + | La première fonction " | ||
| + | Puis, dans cette fonction on retourne " | ||
| + | Puis, dans le " | ||
| + | De ce fait, le " | ||
| + | |||
| + | " | ||
| + | |||
| + | === Async/Await === | ||
| + | " | ||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | async function fonctionAsynchrone1() {/* code asynchrone */} | ||
| + | async function fonctionAsynchrone2() {/* code asynchrone */} | ||
| + | |||
| + | async function fonctionAsynchrone3() { | ||
| + | const value1 = await fonctionAsynchrone1(); | ||
| + | const value2 = await fonctionAsynchrone2(); | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Gerer des erreurs async/await | ||
| + | |||
| + | async/await utilisant les " | ||
| + | Pour intercepter cette erreur, par contre, il suffit d' | ||
| + | |||
| + | ==== Parallélisez plusieurs requêtes HTTP ==== | ||
| + | |||
| + | === Enchaînez des requêtes avec les callbacks === | ||
| + | On peut formuler plusieurs requêtes serveur en parallèle puis ensuite les suivre avec une requête en séquence avec les callbacks. | ||
| + | |||
| + | Pour cet exemple, nous partons du principe que nous avons accès à 2 fonctions (get et post). Elles font respectivement une requête " | ||
| + | * l'URL de la requête, | ||
| + | * Une callback à executer quand on a le résultat (avec une variable d' | ||
| + | |||
| + | |||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | var GETRequestCount = 0; | ||
| + | var GETRequestResults = []; | ||
| + | |||
| + | function onGETRequestDone(err, | ||
| + | if (err) throw err; | ||
| + | | ||
| + | GETRequestCount++; | ||
| + | GETRequestResults.push(result); | ||
| + | | ||
| + | if (GETRequestCount == 2) { | ||
| + | post(url3, function(err, | ||
| + | if (err) throw err; | ||
| + | | ||
| + | // We are done here ! | ||
| + | }); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | get(url1, onGETRequestDone); | ||
| + | get(url2, onGETRequestDone); | ||
| + | </ | ||
| + | |||
| + | |||
| + | Afin d' | ||
| + | |||
| + | Par contre, nous voulons exécuter une requête " | ||
| + | |||
| + | " | ||
| + | |||
| + | === Enchaînez des requêtes avec les Promise === | ||
| + | |||
| + | Grâce à la fonction " | ||
| + | |||
| + | Pour cet exemple, nous partons du principe que nous avons accès à 2 fonctions ( " | ||
| + | |||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | Promise.all([get(url1), | ||
| + | .then(function(results) { | ||
| + | return Promise.all([results, | ||
| + | }) | ||
| + | .then(function(allResults) { | ||
| + | // We are done here ! | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | Ici, nous utilisons la fonction " | ||
| + | |||
| + | Ainsi, la fonction " | ||
| + | |||
| + | Afin d' | ||
| + | |||
| + | Notez: | ||
| + | Notez que dans la fonction " | ||
| + | |||
| + | === Enchaînez des requêtes avec les async/await === | ||
| + | |||
| + | Finalement, voyons comment exécuter le même code mais avec async / await . | ||
| + | |||
| + | Pour cet exemple, nous partons du principe que nous avons accès à 2 fonctions ( " | ||
| + | |||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | async function requests() { | ||
| + | var getResults = await Promise.all([get(url1), | ||
| + | var postResult = await post(url3); | ||
| + | return [getResults, | ||
| + | } | ||
| + | |||
| + | requests().then(function(allResults) { | ||
| + | // We are done here ! | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | Nous utilisons aussi la fonction " | ||
| + | |||
| + | Par contre, ici, nous utilisons " | ||
| + | |||
| + | Lorsque nous appelons la fonction " | ||
| + | |||
| + | ==== Optimisation du code ==== | ||
| + | |||
| + | === Linter, minifier, bundler, transpiler === | ||
| + | |||
| + | <code JavaScript [enable_line_numbers=" | ||
| + | |||
| + | </ | ||