Les contenus du cours BRE03 Web Dev Course © 2024 par Mari Doucet sont sous licence CC BY-NC-SA 4.0
En programmation on dit asynchrone l’exécution différée d’une instruction qui serait normalement bloquante.
JavaScript est mono-thread (pas de parallèlisme) et théoriquement synchrone. Théoriquement parce que certaines fonctions très utilisées ne le sont pas et que parfois les accès concurrents à la console et les caprices du navigateur utilisés peuvent perturber la synchronicité.
Ces problèmes se sont plutôt améliorés depuis 2015 - 2016 mais on a encore parfois quelques surprises.
JS place les instructions asynchrones sont placées dans une file d’éxécution à part (Task Queue) et les éxécute les unes après les autres et les envoie au fur et à mesure dans le fil d’éxécution principale sans bloquer le reste du programme.
// synchrone
function helloWorld()
{
console.log("Hello World !");
}
helloWorld(); // Hello World !
// asynchrone
function helloWorld()
{
setTimeout(() => console.log('Hello world !'), 1000);
console.log("You should see me before seing Hello World !");
}
helloWorld(); // You should see me before seing Hello World ! Hello world !
Une promise est une sorte d’objet à qui l’on transmet deux fonctions qui sont appelées lors de son exécution :
resolve
: si tout s’est bien passéreject
: si une erreur s’est produiteet qui retourne deux fonctions :
then
si tout s’est bien passécatch
si une erreur s’est produitefunction testNumber(number)
{
return new Promise((resolve, reject) => {
if(number <= 100)
{
resolve("OK");
}
else
{
reject("Number too big");
}
});
}
Si ensuite je veux appeler ma fonction :
testNumber(9)
.then(response => console.log(response))
.catch(error => console.log(error));
testNumber(999)
.then(response => console.log(response))
.catch(error => console.log(error));
async
et await
sont des mots clés qui ont permis de simplifier l’écriture du code synchrone en JavaScript.
Lorsque l’on place le mot async devant la définition d’une fonction, on indique que cette fonction va être asynchrone.
await
est un mot clé qui dit “attends la fin de cette opération asynchrone” et permet d’attendre pour récupérer le retour d’une opération asynchrone.
function testNumber(number)
{
return new Promise((resolve, reject) => {
if(number <= 100)
{
resolve("OK");
}
else
{
reject("Number too big");
}
});
}
async function testNumbers()
{
let responseForNine = await testNumber(9);
console.log(responseForNine);
let responseForTwelve = await testNumber(12);
console.log(responseForTwelve);
}
testNumbers();
fetch
est une fonction, fournie par JavaScript qui permet d’interroger une URL distante (une API par exemple) pour récupérer un contenu, le plus souvent en JSON.
fetch
retourne une Promise, appelée Response, qui elle-même retourne une Promise.
let url = 'https://api.example.com/users';
fetch(url)
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error(err));
Du coup ça fait beaucoup de then
. fetch
étant une opération asynchrone, vous pouvez l’utiliser avec async
et await
:
async function getUsers()
{
let url = 'https://api.example.com/users';
let response = await fetch(url);
let data = await response.json();
console.log(data);
}
Par défaut fetch
utilise la méthode HTTP GET
pour communiquer avec l’URL distante, mais elle peut également utiliser POST
:
let url = 'https://api.example.com/register';
let userData = {
username: 'Marianne',
password: 'superSecure'
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error(err));
et avec async
/ await
:
async function register()
{
let url = 'https://api.example.com/register';
let userData = {
username: 'Marianne',
password: 'superSecure'
};
let body = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
}
let response = await fetch(url, body);
let data = await response.json();
console.log(data);
}