Very old school
const uneFonctionUtilisantUneCallback = (delay, cb) => {
setTimeout(() => {
if(Math.random() < .5) {
cb(null, 'random success');
}
else {
cb('random error');
}
}, delay);
};Cette fonction appelle une callback au bout du délai spécifié
(err, success) => {}Signature de la callback
uneFonctionUtilisantUneCallback(3000, (err, success) => {
if(err) {
console.error(`c'est une erreur "${err}"`);
} else {
console.log(`c'est un succès "${success}"`);
}
})c'est une erreur "random error"Résultat
c'est un succès "random success"ou
Old school
Cette fonction retourne une promesse et la résoud au bout du délai spécifié
Plus de callback dans les paramètres,
c'est la promesse qui gère
mais comment écrire la callback pour setTimeout ?
const promise = Promise.resolve('success');Procédons par étape
récupère une promesse contenant le résultat 'success'
promise.then(result => console.log(result)); // => 'success'const promise = Promise.reject('error');récupère une promesse contenant une erreur
promise.catch(err => console.error(err)); // => 'error'const promise = Promise.resolve('success');Procédons par étape
est équivalent à
const promise = new Promise(
(resolve, reject) => resolve('success')
);on voit que resolve et reject peuvent être utilisées
dans la callback passée à setTimeout
const uneFonctionAvecPromesse = delay =>
new Promise((resolve, reject) => {
setTimeout(() => {
if(Math.random() < .5) {
resolve('random success');
}
else {
reject('random error');
}
}, delay);
});Cette fonction retourne une promesse et la résoud au bout du délai spécifié
Plus besoin de passer une callback en paramètre,
c'est la promesse qui gère
uneFonctionAvecPromesse(3000)
.then(success => {
console.log(`c'est un succès "${success}"`);
})
.catch(err => {
console.error(`c'est une erreur "${err}"`);
});c'est une erreur "random error"Résultat
c'est un succès "random success"ou
modern school
Cette fonction retourne un succès ou lève une erreur au bout du délai spécifié
Même problème setTimeout qu'avec les promesses
const result = await Promise.resolve('success');Procédons par étape
récupère le résutat 'success'
console.log(result) // => 'success'const result = await Promise.reject('error');lève une exception 'error'
const result = await Promise.resolve('success');Procédons par étape
est équivalent à
const result = await new Promise(
(resolve, reject) => resolve('success')
);resolve et reject peuvent être utilisées dans les callback
const uneFonctionAsyncAwait = async (delay) =>
await new Promise((resolve, reject) => {
setTimeout(() => {
if(Math.random() < .5) {
resolve('random success');
}
else {
reject('random error');
}
}, delay);
});Cette fonction retourne un succès ou lève une erreur au bout du délai spécifié
C'est la même fonction que précédemment
mais avec les mots magiques async et await
En fait ça ne sert quasiment à rien puisque async indique qu'on retourne une promesse, et await converti la promesse
En gros on a encapsulé une valeur dans une promesse pour l'extraire et la remettre dans une promesse
try {
const success = await uneFonctionAsyncAwait(3000);
console.log(`c'est un succès "${success}"`);
}
catch(error) {
console.error(`c'est une erreur "${error}"`);
}c'est une erreur "random error"Résultat
c'est un succès "random success"ou
=> on peut utiliser directement une méthode retournant une promesse avec await
try {
const success = await uneFonctionAvecPromesse(3000);
console.log(`c'est un succès "${success}"`);
}
catch(error) {
console.error(`c'est une erreur "${error}"`);
}