DEV Community

loading...
Cover image for Comment fonctionne le Async / Await en javascript ?

Comment fonctionne le Async / Await en javascript ?

Eric Le Codeur
Javascript, Python et PHP
Updated on ・3 min read

Si vous désirez plus de contenu francophone comme celui-ci, cliquer Follow ou suivez-moi sur Twitter


Synchrone vs Asynchrone

Le code synchrone est exécuté ligne par ligne. Chaque ligne de code attend toujours la fin de la ligne précédente avant d'exécuter la suivante. Alors évidemment, le problème est qu'une opération longue durée bloquera l'exécution du code.

Le code asynchrone quant à lui n'est pas bloquant, alors il n'attend pas la fin d'une autre tâche.

Un exemple d'asynchrone en javascript est la fonction fetch() Fetch) permet d'obtenir des données (généralement en format JSON) à un serveur web de manière dynamique (sans bloqué l'exécution du code et sans recharger la page)

Une fonction asynchrone moderne comme fetch() renvoie une promesse. aka, un conteneur/espace réservé pour un résultat futur. Le futur résultat/valeur est la réponse de l'appel fetch.

// Exemple d'une fonction fetch() renvoyant une promesse
const request = fetch('http://example.com/api/cats')

// Retourne une promesse
console.log(request) // Promise {<pending>}
Enter fullscreen mode Exit fullscreen mode

Une promesse est en attente jusqu'à ce qu'elle soit réglée (terminé). Il peut avoir deux statuts réglés : accompli (succès) ou rejeté (erreur).

// Exemple d'une fonction fetch() renvoyant une promesse
const getCatsImage = function() {
  // La fonction fetch() renvoie une promesse
  // Lorsque la promesse est remplie, la fonction s'exécute
  // Le résultat est contenu dans le paramètre data
  const request = fetch('http://example.com/api/cats')
    .then(response => return response.json())
    .then(data => loadCatImage(data[0]))
  })
}
Enter fullscreen mode Exit fullscreen mode

Gestion des erreurs

const getCatsImage = function() {
  // La fonction fetch() renvoie une promesse
  // Lorsque la promesse est remplie, la fonction s'exécute
  // Le résultat est contenu dans le paramètre data
  // Si y il a erreur la fonction catch() va s'éxécuter
  // La fonction finally() s'éxécute dans tous les cas
  const request = fetch('http://example.com/api/cats')
    .then(response => return response.json())
    .then(data => loadCatImage(data[0]))
    .catch(err => console.log(err))
    .finally(() => console.log('Run after both')
  })
}
Enter fullscreen mode Exit fullscreen mode

Créer une promesse

const wait = function(sec) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      resolve('wait over')
    }, sec * 1000)
  })
}

wait(3).then((msg) => console.log(msg)) // wait over
Enter fullscreen mode Exit fullscreen mode

Async / Await
La fonction async et le mot-clé await ont été introduits comme une extension des promesses. Ils ont été introduits pour rendre la programmation asynchrone basée sur des promesses plus lisible. Async/await simplifie simplement la syntaxe utilisée pour consommer une promesse.

// Async exécute la fonction en mode asynchrone
// et retourne une promesse
const delay = async function(sec) {
  // Await met en pause le bloc de fonction asynchrone du code
  // jusqu'à ce que la promesse retourne un résultat
  const response = await new Promise(function(resolve, reject) {
     setTimeout(() => {
      resolve('wait over')
    }, sec * 1000)
  })
  console.log(response)
}

delay(3)
Enter fullscreen mode Exit fullscreen mode

Catch error in async/await

const delay = async function(sec) {
  try {
    const response = await new Promise(function(resolve, reject) {
      setTimeout(() => {
        resolve('wait over')
      }, sec * 1000)
    })
    console.log(response)
  } catch(err) {
    console.log(err.message)
    // You can also throw error up to calling parent
    throw err
  }
}
delay(3)

Enter fullscreen mode Exit fullscreen mode

Le mot-clé await ne peut être utilisé que dans une fonction Async. Donc, pour utiliser await dans le module principal, vous devez créer un IIFE (fonction immédiatement invoquée)

(async function() {
  const cats = await getCats()
  console.log('start')
  console.log(cats)
  console.log('end')
})()
Enter fullscreen mode Exit fullscreen mode

Même concept mais avec l'opérateur then()

console.log('start')
getCats().then(cats => {
    console.log(cats)
    console.log('end')
}
Enter fullscreen mode Exit fullscreen mode

Exécuter des promesses en parallèle

(async function() {
  // const cats = await getCats()
  // const dogs = await getDogs()
  // utiliser Promise.all pour exécution en parallèle
  const data = await Promise.all([getCats(), getDogs()])
  console.log('start')
  // Promise.All returne un tableau
  console.log(data[0]) //cats
  console.log(data[1]) //dogs
  console.log('end')
})()
Enter fullscreen mode Exit fullscreen mode

Discussion (0)