Introduction
Introduction
Introduction
com
E-mail:a.ourdou@usms.ma
1
Comment se déroulera ce cours ?
Note finale = 50% Tech JS + 50% Mobile
Individuel ou équipe de deux personnes maximum pour le Projet (le cahier des charges sera envoyé ultérieurement)
Github sera utilisé pour stocker vos TP (un dépôt avec chaque TP dans un dossier séparé)
2
Technologies JS
JavaScript avancé
Compréhension de base et avancée du fonctionnement de Node.js
Express JS
Manuscrit
Angulaire
3
Introduction
Comment ça marche ?
Le navigateur utilise uniquement la version vanilla V8 pour des raisons de sécurité (vous ne pouvez pas accéder aux systèmes de fichiers locaux)
4
Introduction
Installation de Node.JS :https://nodejs.org/fr
Noeud REPL
Lire
Évaluer
Imprimer
Boucle
5
Introduction
Notes annexes :
Node.js est un environnement d'exécution JS => vous pouvez l'utiliser pour bien plus que du code côté serveur (sans se limiter aux serveurs), par exemple des scripts utilitaires, des outils de création,
etc.
6
JavaScript
Qu'est-ce que JS
Histoire
JS de base
JS avancé
7
Qu'est-ce que JS
JavaScript (JS) est un langage de programmation interprété léger (ou compilé juste à temps). Bien qu'il soit surtout connu comme langage de script pour les
pages Web, de nombreux environnements non liés aux navigateurs l'utilisent également, comme Node.js. JavaScript est un langage dynamique basé sur des
prototypes, multi-paradigmes, monothread, prenant en charge les styles orientés objet.
8
Spécification du langage ECMAScript
ECMA : Association européenne des fabricants d'ordinateurs
ECMA-262
Il s'agit d'une norme publiée par Ecma International. Elle contient la spécification d'un langage de script à usage général.
Script ECMA
ECMAScript ou ES - est un langage de programmation à usage général, normalisé par ECMA International selon le
document ECMA-262.
Bien que ECMAScript soit inspiré de JavaScript, ce sont des langages de programmation différents et ECMAScript n'est pas la
spécification de JavaScript.
JavaScript
En lisant la spécification ECMAScript, vous apprendrez à créer un langage de script. En lisant la documentation JavaScript, vous
apprendrez à utiliser un langage de script.
9
JavaScript
JavaScript, avec HTML et CSS, est l'une des technologies de base du World Wide Web. JavaScript
JavaScript est également utilisé dans le développement d'applications mobiles pour créer des applications multiplateformes pouvant fonctionner à la fois sur iOS et Android.
JavaScript est le langage de programmation le plus populaire selon l'enquête 2021 sur les développeurs Stack Overflow
10
Histoire
JavaScript a été créé en mai 1995 en 10 jours par Brendan Eich. Eich travaillait chez Netscape et a implémenté JavaScript pour leur
navigateur Web, Netscape Navigator.
1998, ECMAScript 2 a été publié et Netscape 42 a été publié avec JavaScript 1.3. En 1999,
ECMAScript 3 a été publié et Netscape 62 a été publié avec JavaScript 1.5. En 2008, ECMAScript 4
a été abandonné.
11
JavaScript évolue : ne détruisez pas le Web
Une idée qui revient parfois est de nettoyer JavaScript en supprimant les anciennes fonctionnalités et les bizarreries. Si l'attrait de cette idée est évident,
Supposons que nous créions une nouvelle version de JavaScript qui n'est pas rétrocompatible et que nous corrigions tous ses défauts. Nous rencontrerions
Alors, quelle est la solution ? L’approche choisie pour ES6 s’appelle « One JavaScript » :
Les nouvelles versions sont toujours entièrement rétrocompatibles (mais il peut parfois y avoir des nettoyages mineurs, à peine perceptibles).
Les anciennes fonctionnalités ne sont pas supprimées ni corrigées. Au lieu de cela, de meilleures versions sont introduites. Un exemple est la déclaration de
Si des aspects de la langue sont modifiés, cela se fait dans le cadre de nouvelles constructions syntaxiques. Autrement dit, vous y consentez implicitement.
12
Plateformes
Plateformes sur lesquelles JavaScript peut être utilisé :
Navigateur Web
Node.js
13
La structure des navigateurs et de Node.js
14
Structure des navigateurs et de Node.js
Les structures des deux plates-formes JavaScript, navigateur Web et Node.js, sont similaires
La couche fondamentale est constituée du moteur JavaScript et des fonctionnalités « de base » spécifiques à la plateforme.
La bibliothèque standard JavaScript fait partie de JavaScript proprement dit et s'exécute sur le moteur.
L'API de la plateforme est également disponible à partir de JavaScript. Elle permet d'accéder à des fonctionnalités spécifiques à la plateforme. Par exemple :
Dans les navigateurs, vous devez utiliser l'API spécifique à la plate-forme si vous souhaitez faire quoi que ce soit en rapport avec l'interface
Dans Node.js, l'API spécifique à la plateforme vous permet de lire et d'écrire des fichiers, de télécharger des données via HTTP, etc.
15
Notions de base
16
Commentaires
/*
Commenter avec
plusieurs lignes
*/
17
Valeurs
18
Valeurs primitives :
Elles sont passées par valeur : lorsque des valeurs primitives sont affectées à des variables ou passées à des fonctions, leur contenu est copié. Elles
sont comparées par valeur : lorsque deux valeurs primitives sont comparées, leur contenu est comparé.
19
Objets : Ce sont des éléments composés de données.
Ils sont passés par identité : lorsque des objets sont affectés à des variables ou passés à des fonctions, leurs identités (pensez aux pointeurs) sont
copiées.
On les compare par identité : lorsqu’on compare deux objets, on compare leurs identités.
L'identité d'un objet est comme un pointeur (ou une référence transparente) vers les données réelles de l'objet sur le tas (pensez à la mémoire
principale partagée d'un moteur JavaScript).
constanteobj = {
d'abord:"Jeanne",
dernier:"Biche",
};
constantefruits = ["fraise","pomme"];
20
Objets:
Les deux opérateurs typeof et instanceof permettent de déterminer le type d'une valeur x donnée :
Conseil:Règle empirique : typeof est pour les valeurs primitives ; instanceof est pour les objets.
21
Connexion à la console
// Impression d'une valeur sur la sortie standard (un autre appel de méthode)
console.enregistrer("Bonjour!");
22
Déclaration des variables
constante(ES6 - 2015) crée des liaisons de variables immuables : chaque variable doit être initialisée immédiatement et nous ne pouvons pas attribuer une valeur différente
ultérieurement.
// x = 9;
23
Déclaration des variables
y =3*5;
// Déclaration et initialisation de z :
laisserz =3*5;
24
Déclaration des variables
3. Utilisez toujours const si le type ne doit pas être modifié (tableaux et objets)
5. N'utilisez var que si vous DEVEZ prendre en charge les anciens navigateurs.
25
Déclaration des variables
Toutes les variables JavaScript doivent être identifiées par des noms uniques. Ces noms uniques sont appelés identifiants. Les identifiants peuvent être des noms
courts (comme x et y) ou des noms plus descriptifs (age, sum, totalVolume). Les règles générales de construction des noms de variables (identifiants uniques) sont
les suivantes :
1. Les noms peuvent contenir des lettres, des chiffres, des traits de soulignement et des signes dollar.
5. Les mots réservés (comme les mots-clés JavaScript) ne peuvent pas être utilisés comme noms.
26
Le scoop d'une variable
La portée d'une variable est la région d'un programme où elle est accessible.
Pelle à blocs
{
laisserx =2;
}
// x ne peut PAS être utilisé ici
Variables déclarées avec levarle mot-clé ne peut PAS avoir de portée de bloc.
{
varx =2;
}
// x PEUT être utilisé ici
27
Scoop local
fonctionmaFonction() {
laissernom_voiture ="Volvo";
Fonction pelle
fonctionmaFonction() {
laissernom_voiture ="Volvo";// Portée de la fonction
fonctionmaFonction() {
28
Variables JavaScript globales : une variable déclarée en dehors d’une fonction devient GLOBALE.
laissernom_voiture ="Volvo";
fonctionmaFonction() {
// le code ici peut également utiliser carName
29
Déclarations de fonctions
Fonction simple
retoura + b;
}
// Appel de la fonction add1()
console.enregistrer(ajouter1(5,2));
Une déclaration de fonction est toujours exécutée lorsqu'elle entre dans sa portée, quel que soit son emplacement dans cette portée. Cela vous
permet d'appeler une fonction foo() avant qu'elle ne soit déclarée :
foo();// D'ACCORD
fonctionfoo() {
retour123;
}
30
Expressions de fonctions fléchées
Les expressions de fonction fléchées sont utilisées notamment comme arguments d'appels de fonctions et d'appels de méthodes. Si vous déclarez une fonction via
const ou let, elle n'est pas activée prématurément. Dans l'exemple suivant, vous ne pouvez utiliser bar() qu'après sa déclaration.
retoura + b;
};
// Appel de la fonction add2(),
console.enregistrer(ajouter2(5,2));
Même si une fonction g() n'est pas activée prématurément, elle peut être appelée par une fonction précédente f() (dans la même portée) si l'on respecte
la règle suivante : f() doit être invoquée après la déclaration de g().
constantef= () =>g();
constanteg= () =>123;
31
Objets
// Création d'un objet simple via un objet littéral
constanteobj = {
d'abord:"Jeanne",// propriété
dernier:"Biche",// propriété
obtenir le nom complet() {
// propriété (méthode)
retource.premier +" "+ce.dernier;
},
};
console.enregistrer(obj.premier);// Jeanne
obj.premier ="Janey";
// Appel de la méthode
32
Tableaux
constantearr = ['un','b','c'];
console.enregistrer(arr[1]);
arr[1] ='R';
arr.pousser('d');
()//convertit un tableau en une chaîne de valeurs de tableau (séparées par des virgules)
populaire()// supprime le dernier élément d'un tableau et renvoie la valeur qui a été « extraite »
pousser()// ajoute un nouvel élément à un tableau (à la fin)
rejoindre()// joint tous les éléments du tableau dans une chaîne, t se comporte comme toString(), mais en plus vous pouvez spécifier le séparateur
changement()// supprime le premier élément du tableau et « décale » tous les autres éléments vers un index inférieur.
décaler()// ajoute un nouvel élément à un tableau (au début) et « décale » les éléments plus anciens
33
Cartes
Avant ES6, JavaScript n'avait pas de structure de données pour les dictionnaires. ES6 a apporté les Maps, qui sont des dictionnaires de valeurs arbitraires à
des valeurs arbitraires. Une instance de Map mappe des clés à des valeurs. Un mappage clé-valeur unique est appelé une entrée.
["pommes",500],
["bananes",300],
["oranges",200]
]);
// Créer une carte
constantefruits =nouveauCarte();
fruits.ensemble("pommes",500);
fruits.ensemble("bananes",300);
fruits.ensemble("oranges",200);
fruits.obtenir("pommes");
fruits.taille;
fruits.supprimer("pommes");
34
fruits.clair();
// Lister toutes les entrées
pour(constantexdefruits.entrées()) {
texte += x;
}
pour(constantexdefruits.clés()) {
texte += x;
}
pour(constantexdefruits.valeurs()) {
texte += x;
35
Ensembles
Un ensemble JavaScript est une collection de valeurs uniques. Chaque valeur ne peut apparaître qu'une seule fois dans un ensemble. Un ensemble peut contenir n'importe quelle valeur de n'importe quel type de
données.
constantelettres =nouveauEnsemble(["un","b","c"]);
constantelettres =nouveauEnsemble();
courrier.ajouter("un");
courrier.ajouter("b");
courrier.ajouter("c");
pour(constantexdecourrier.valeurs()) {
console.enregistrer(x);
lettres.forEach (fonction(valeur) {
texte += valeur;
})
36
Énoncé conditionnel :
si(condition1) {
// bloc de code à exécuter si la condition 1 est vraie
}sinon si(condition2) {
// bloc de code à exécuter si la condition1 est fausse et la condition2 est vraie
}autre{
changer(expression) {
casx:
// bloc de code
casser;
caset:
// bloc de code
casser;
défaut:
// bloc de code
}
37
Boucles
texte += personne[x];
constantenombres = [45,4,9,16,25];
Nombres.pour chaque(maFonction);
laisserlangue ="JavaScript";
texte += x;
}
39
alors que(je <10) {
texte +="Le numéro est"+ je;
je++;
}
faire{
je++;
}alors que(je <10);
40
Cours
ES6 a introduit des classes. Les classes peuvent être considérées comme une partition de l'objet de type unique de la spécification en sous-types.
Elles nous donnent plus de types que les 7 types limités de la spécification. Chaque classe est le type des objets qu'elle a créés.
classePersonne{
constructor(nom) {
ce.name = nom;
}
décrire() {
retour`Personne nommée${this.nom}`;
}
statiqueNoms de journaux(personnes) {
}
}
}
41
class Employés'étendPerson {
constructor(nom, titre) {
super(nom);
this.titre = titre;
}
describe() {
return super.describe() +` (${this.titre})`;
}
}
console.log(Jeanne.describe());
42
Gestion des exceptions
function capturesException() {
essayer{
throwsException();
} attraper(err) {
console.log(message d'erreur);
}
}
Le code à l’intérieur de la clause finally est toujours exécuté à la fin d’une instruction try, peu importe ce qui se passe dans le bloc try ou dans la
clause catch.
43
Avancé
44
Objets
Pouvoir créer des objets directement (sans classes) est l’un des points forts de JavaScript.
maMéthode() {
return 2;
},// virgule!
obtenirmonAccesseur() {
return this.maPropriété;
}, // comma!
ensemblemyAccessor(valeur) {
this.myProperty = valeur;
}, // la dernière virgule est facultative
};
45
Se propageant dans les objets :
La syntaxe de propagation peut être utilisée lorsque tous les éléments d'un objet ou d'un tableau doivent être inclus dans un nouveau tableau ou objet, ou doivent être
appliqués un par un dans la liste des arguments d'un appel de fonction. Il existe trois endroits distincts qui acceptent la syntaxe de propagation :
const original = {
un: 1,
b: {
c: 3,
},
};
. . . original,// propagation
d: 4,
};
46
Bien que la syntaxe semble la même, elles ont une sémantique légèrement différente.
Seules les valeurs itérables, commeTableauand Chaîne ,peut être réparti dans des littéraux de tableau et des listes d'arguments. De nombreux objets ne sont pas itérables, y
compris tous les objets simples qui n'ont pas de méthode Symbol.iterator :
En revanche, la répartition dans les littéraux d'objet énumère les propriétés propres de la valeur. Pour les tableaux classiques, tous les indices sont des propriétés propres
énumérables, de sorte que les tableaux peuvent être répartis dans des objets.
Tousprimitifspeut être réparti dans des objets. Seules les chaînes ont des propriétés propres énumérables, et la répartition de quoi que ce soit d'autre ne crée
47
Nous pouvons utiliser la diffusion pour créer une copie d'un objet original :
Le premier niveau de copie est en réalité une copie : si nous modifions des propriétés à ce niveau, cela n’affecte pas l’original.
Cependant, les niveaux plus profonds ne sont pas copiés. Par exemple, la valeur de .b est partagée entre l'original et la copie. La modification de .b dans la copie la
Les copies profondes d'objets (où tous les niveaux sont copiés) sont notoirement difficiles à réaliser de manière générique. Par conséquent, JavaScript ne
dispose pas d'une opération intégrée pour elles (pour l'instant). Si nous avons besoin d'une telle opération, nous devons l'implémenter nous-mêmes.
48
Prototypes
Les prototypes sont le seul mécanisme d'héritage de JavaScript : chaque objet possède un prototype qui est soit nul, soit un objet. Dans ce dernier
cas, l'objet hérite de toutes les propriétés du prototype.
constantemonObjet = {
ville:"Casablanca",
saluer() {
console.enregistrer(`Salutations de${ce.ville}`);
},
};
Que voyez-vous lorsque vous tapez le nom de l'objet suivi d'un point dans la console, commemonObjet.
49
Quelles sont ces propriétés supplémentaires et d’où viennent-elles ?
Chaque objet en JavaScript possède une propriété intégrée, appelée sonprototype. Le prototype est lui-même un objet, donc le prototype aura son
propre prototype, créant ce qu'on appelle unchaîne prototype . La chaîne se termine lorsque nous atteignons un prototype qui a null comme propre
prototype.
Lorsque vous essayez d'accéder à une propriété d'un objet : si la propriété ne peut pas être trouvée dans l'objet lui-même, la recherche de la propriété est effectuée dans
le prototype. Si la propriété ne peut toujours pas être trouvée, la recherche est effectuée dans le prototype du prototype, et ainsi de suite jusqu'à ce que la propriété soit
chercheà la chaînedansmonObjet
je ne le trouve pas là, alors je regarde dans l'objet prototype demonObjetpour
le trouve là et l'appelle.
Objet.obtenirPrototypeOf(objet:Objet) :Objet
50
1. Expliquez maintenant ce qui se passe ici :
constantemaDate =nouveauDate();
laisserobjet = maDate;
faire{
objet =Objet.obtenirPrototypeOf(objet);
console.enregistrer(objet);
}alors que(objet);
2. Que se passe-t-il si vous définissez une propriété dans un objet, alors qu'une propriété portant le même nom est définie dans le prototype
de l'objet ?
51
Il existe différentes manières de définir le prototype d'un objet en JavaScript, et nous en décrirons ici deux : Object.create() et les
constructeurs.
Utilisation de Object.create :
LeObjet.create()La méthode crée un nouvel objet et vous permet de spécifier un objet qui sera utilisé comme prototype du nouvel
objet.
constantepersonnePrototype = {
saluer() {
console.enregistrer("Bonjour!");
},
};
constantecarl =Objet.créer(personnePrototype);
carl.saluer();// Bonjour!
Ici, nous créons un objetpersonnePrototype ,qui a unsaluer()méthode. Nous utilisons ensuiteObjet.create()pour créer un nouvel objet avec
personnePrototypecomme son prototype. Maintenant, nous pouvons appelersaluer()sur le nouvel objet, et le prototype fournit son
implémentation.
52
Utiliser un constructeur
En JavaScript, toutes les fonctions ont une propriété nomméeprototype .Lorsque vous appelez une fonction en tant que constructeur, cette propriété est définie
comme le prototype de l'objet nouvellement construit (par convention, dans la propriété nommée __proto__ ).
constantepersonnePrototype = {
saluer() {
console.enregistrer("Bonjour, je m'appelle${ce.nom}!`);
},
};
fonctionPersonne(nom) {
ce.name = nom;
Objet.attribuer(Personne.prototype, personnePrototype);
// ou
// Personne.prototype.greet = personnePrototype.greet;
constantemehdi =nouveauPersonne("Mehdi");
constanteoumaima =nouveauPersonne("Oumaima");
console.enregistrer(Objet.possède(oumaima,"nom"));// vrai
console.enregistrer(Objet.possède(oumaima,"saluer"));// FAUX
Remarque : vous pouvez également utiliser la méthode non statique Object.hasOwnProperty() ici, mais nous vous recommandons d'utiliser
54
Cours
Les classes sont fondamentalement une syntaxe compacte pour la configuration de chaînes de prototypes. Sous le capot, les classes de JavaScript ne sont pas conventionnelles.
Mais c'est quelque chose que nous voyons rarement lorsque nous travaillons avec elles. Notez que nous n'avons pas besoin de classes pour créer des objets. Nous pouvons
classePersonne{
# prénom;// (UN)
constructor(prénom) {
this.#firstName = prénom;// (B)
}
décrire() {
retour`Personne nommée${this.#prénom}`;
}
statiqueextraire les noms(personnes) {
}
};const Tarzan =new Person(« Tarzan »);
[ES2022] champ privé .#firstName. Contrairement aux propriétés, les champs privés doivent être déclarés (ligne A) avant de pouvoir être utilisés
(ligne B). Un champ privé n'est accessible qu'à l'intérieur de la classe qui le déclare. Il n'est même pas accessible par les sous-classes.
55
Sous-classe :
class Employés'étendPerson {
constructor(prénom, titre) {
super(prénom);
this.titre = titre;// (C)
}
describe() {
return super.describe() +
` (${this.titre})`;
}
}
56
Programmation asynchrone
57
Asynchronous programming
Dans sa forme la plus basique, JS est un langage synchrone, bloquant et monothread
Synchrone
Si nous avons deux fonctions qui enregistrent des messages sur la console, le code s'exécute de haut en bas, avec une seule ligne exécutée à un
moment donné
Blocage
Quelle que soit la durée d'un processus précédent, les processus suivants ne démarreront pas tant que le premier n'est pas terminé.
Si la fonction A devait exécuter un bloc de code intensif, JS doit le terminer sans passer à la fonction B. Même si ce code
prend 10 secondes ou 1 minute
L'application Web s'exécute dans un navigateur et exécute un bloc de code intensif sans rendre le contrôle au
navigateur. Le navigateur peut sembler gelé.
Un seul thread
Un thread est simplement un processus que votre programme JS peut utiliser pour exécuter une tâche
JS n'a qu'un seul thread appelé thread principal pour exécuter un code
58
Problème
JS, s'il passe simplement à la ligne suivante sans attendre, nous avons une erreur car les données ne sont pas ce que nous attendons. Nous avons
59
Comment ?
Les navigateurs Web définissent des fonctions et des API qui nous permettent d'enregistrer des fonctions qui ne doivent pas être exécutées de manière synchrone et
qui doivent plutôt être invoquées de manière asynchrone lorsqu'un événement se produit.
Par exemple, cela peut être le passage du temps (setTimeout ou setInterval), l'interaction de l'utilisateur avec la souris
(addEventListener) ou l'arrivée de données sur le réseau (callbacks, Promises, async-await)
60
setTimeout()
La fonction setTimeout() exécute un bloc de code particulier une fois qu'un temps spécifié s'est écoulé. Le
premier paramètre est une fonction à exécuter ou une référence à une fonction définie ailleurs
Le deuxième paramètre est un nombre représentant la durée en millisecondes à attendre avant d'exécuter le code
Après le deuxième paramètre, vous pouvez transmettre zéro ou plusieurs valeurs qui représentent les paramètres que vous souhaitez transmettre à la fonction
fonctionsaluer(nom) {
console.enregistrer(`Bonjour${nom}`);
définirTimeout(saluer,2000,"Amal");
61
Pour effacer un délai d'attente, vous pouvez utiliser la méthode clearTimeout() en transmettant l'identifiant renvoyé par setTimeout en tant que paramètre
fonctionsaluer(nom) {
console.enregistrer(`Bonjour`);
constantetimeoutId =définirTimeout(saluer,2000);
effacerTimeout(timeoutId);
62
setInterval()
La fonction setInterval() exécute le même code à plusieurs reprises à intervalles réguliers. Le premier
paramètre est une fonction à exécuter ou une référence à une fonction définie ailleurs.
Après le deuxième paramètre, vous pouvez transmettre zéro ou plusieurs valeurs qui représentent les paramètres que vous souhaitez transmettre à la fonction
fonctionsaluer(nom) {
console.enregistrer(`Bonjour`);
définirIntervalle(saluer,2000);
Les intervalles permettent à une tâche de s'exécuter indéfiniment, vous devez donc effacer l'intervalle lorsque cela est approprié.
constanteintervalleId =définirIntervalle(saluer,2000);
Intervalle d'effacement(intervalleId);
63
Les temporisateurs et les intervalles ne font pas partie de JS lui-même. Ils sont implémentés par le navigateur et setTimeout et setInterval sont
définirIntervalle(fonctioncourir() {
console.enregistrer("Bonjour");
},1000);
64
Pour setTimeout, la durée est garantie entre les exécutions. Quel que soit le temps d'exécution, l'intervalle restera le
même
Pour setInterval, l'intervalle de durée inclut le temps nécessaire pour exécuter le code que vous souhaitez exécuter
si le code peut prendre plus de temps à s'exécuter, alors l'intervalle de temps lui-même => Recursive setTimeout
65
Rappels
En JavaScript, les fonctions sont des objets de première classe
Tout comme un objet, une fonction peut être passée en tant qu'argument à une fonction. Une fonction
peut également être renvoyée sous forme de valeurs à partir d'autres fonctions.
Toute fonction transmise en tant qu'argument à une autre fonction est appelée fonction de rappel en JavaScript. La fonction
qui accepte une fonction comme argument ou renvoie une fonction est appelée fonction d'ordre supérieur.
fonctionsaluer(nom) {
console.enregistrer(`Bonjour${nom}`);
fonctionsaluerAmal(salutFn) {
constantenom ="Amal";
saluerFn(nom);
}
saluerAmal(saluer);
Un rappel asynchrone est un rappel qui est souvent utilisé pour continuer ou reprendre l'exécution du code une fois qu'une opération
asynchrone est terminée.
Les rappels sont utilisés pour retarder l'exécution d'une fonction jusqu'à ce qu'un moment ou un événement particulier se soit produit.
La récupération des données prend du temps et nous ne pouvons exécuter la fonction que nous voulons qu'une fois les données récupérées et pas immédiatement.
67
Problème
Si vous avez plusieurs fonctions de rappel où chaque niveau dépend du résultat obtenu à partir du niveau précédent, l'imbrication des
fonctions devient si profonde que le code devient difficile à lire et à maintenir
chargerScript('1.js',fonction(erreur, script) {
si(erreur) {
gérerErreur(erreur);
}autre{
// ...
chargerScript('2.js',fonction(erreur, script) {
si(erreur) {
gérerErreur(erreur);
}autre{
// ...
chargerScript('3.js',fonction(erreur, script) {
si(erreur) {
gérerErreur(erreur);
}autre{
// ...continuer après que tous les scripts soient chargés (*)
}
});
}
}); 68
}
Promesses
Les promesses nous aident à gérer le code asynchrone d'une manière beaucoup plus simple par rapport aux rappels.
69
constantepromesse =nouveauPromesse((résoudre, rejeter) => {
définirTimeout(() => {
},5000);
});
définirTimeout(() => {
},5000);
});
console.enregistrer(résultat);
};
console.enregistrer(erreur);
};
promesse.alors(sur l'accomplissement);
promis.attraper(surRejeter);
70
Promesse.tout()
Interrogez plusieurs API et effectuez certaines actions, mais seulement une fois que toutes les API ont terminé leur chargement
constantepromesse1 =Promesse.résoudre(3);
constantepromesse2 =42;
définirTimeout(résoudre,100,"foo");
});
});
Lepromesse.tout()la méthode prend un itérable de promesses en entrée et renvoie une promesse unique qui se résout en un tableau des
résultats des promesses d'entrée
La promesse renvoyée sera résolue lorsque toutes les promesses de l'entrée seront résolues
Il rejette immédiatement si l'une des promesses d'entrée est rejetée ou si la promesse génère une erreur, et rejettera tout
71
Promesse.allSettled()
Promesse.allSettled()attend que toutes les promesses d'entrée soient complétées, que l'une d'entre elles soit rejetée ou non
constantepromesse1 =Promesse.résoudre(3);
constantepromesse2 =42;
définirTimeout(rejeter,100,"foo");
});
});
72
Promesse.race()
LePromesse.race()la méthode renvoie une promesse qui se réalise ou se rejette dès qu'une des promesses d'entrée se réalise ou se rejette,
avec la valeur ou la raison de cette promesse.
définirTimeout(résoudre,500,"un");
});
définirTimeout(résoudre,100,"deux");
});
});
73
Exercice 1
/*
1. Imprimez « Programme démarré » au début de votre code
74
Exercice 2
/*
1. Imprimez « Programme démarré » au début de votre code
2. Créez une promesse qui se résout après 3 secondes et se rejette après 2 secondes
3. Déconnectez-vous de la promesse pendant qu'elle est en attente
75
Exercice 3
/*
1. Imprimez « Programme démarré » au début de votre code
7. Imprimez le message de la deuxième promesse après qu'elle soit accomplie (« étape 2 terminée »)
*/
76
Attente asynchrone
Le mot-clé async wait nous permet d'écrire du code complètement synchrone tout en effectuant des tâches asynchrones en
coulisses
Le mot clé async est utilisé pour déclarer des fonctions asynchrones
Les fonctions asynchrones sont des fonctions qui sont des instances deFonction asynchroneconstructor
Contrairement aux fonctions normales, les fonctions asynchrones renvoient toujours une promesse qui sera résolue avec la valeur renvoyée par la
fonction asynchrone, ou rejetée avec une exception non détectée dans la fonction asynchrone
// Fonction asynchrone
fonction asynchronesaluer() {
retour"Bonjour";
}
console.log(greet());
}
greet2().then((valeur) =>console.log(valeur));
77
attendre
attendrele mot-clé peut être placé devant n'importe quelle fonction asynchrone pour mettre votre code en pause jusqu'à ce que cette promesse soit réglée et renvoie ses résultats
await ne fonctionne qu'à l'intérieur des fonctions asynchrones. Impossible à utiliserawait dans les fonctions normales
setTimeout(() =>resolve("Hello"),1000);
});
console.log(résultat);
}
greet();
78
Boucle d'événement
JavaScript est monothread. Heureusement, le navigateur nous offre certaines fonctionnalités que le moteur JavaScript lui-même ne fournit pas :
une API Web. Cela inclut l'API DOM, setTimeout, les requêtes HTTP, etc. Cela peut nous aider à créer un comportement asynchrone et non
bloquant.
79
Exemple : Code synchrone
console.log('D'abord');
console.log('Deuxième');
console.log('Troisième');
80
Exemple : code setTimeput asynchrone
console.log("D'abord");
setTimeout(() => {
console.log("Deuxième");
},2000);
console.log("troisième");
81
Exemple : code de promesse asynchrone
console.log("First");
console.log("deuxième");
82
Exemple : setTimeout + code de promesse
setTimeout(() => {
console.log("First");
}, 0);
let je;
pour(je =0; je <100000000; i++) {
//bloque pendant quelques secondes
}
console.log("second");
83
Voici un exemple qui démontre quedéfinirTimeoutne s'exécute pas immédiatement après l'expiration de son délai :
définirTimeout(() => {
// affiche « 2 », ce qui signifie que le rappel n'est pas appelé immédiatement après 500 millisecondes.
console.enregistrer(`J'ai couru après${nouveauDate().getTime() /1000- secondes}secondes`);
},500);
alors que(vrai) {
casser;
}
}
84
Zéro retard
Un délai nul ne signifie pas que le rappel sera déclenché après zéro milliseconde.définirTimeoutavec un délai de 0 (zéro)
milliseconde n'exécute pas la fonction de rappel après l'intervalle donné.
console.enregistrer("c'est le début");
définirTimeout(() => {
console.enregistrer(« Rappel 1 : ceci est un message de rappel »);
});// a une valeur de temps par défaut de 0
définirTimeout(() => {
console.enregistrer(« Rappel 2 : ceci est un message de rappel »);
},0);
console.enregistrer("c'est la fin");```
85