Maison >interface Web >js tutoriel >Comment puis-je travailler avec JavaScript asynchrone en utilisant des rappels, des promesses et des asynchrones / attendre?

Comment puis-je travailler avec JavaScript asynchrone en utilisant des rappels, des promesses et des asynchrones / attendre?

Emily Anne Brown
Emily Anne Brownoriginal
2025-03-12 16:34:18262parcourir

Comment puis-je travailler avec JavaScript asynchrone en utilisant des rappels, des promesses et des asynchrones / attendre?

Travailler avec JavaScript asynchrone en utilisant des rappels

Les rappels sont le moyen le plus fondamental de gérer les opérations asynchrones en JavaScript. Un rappel est une fonction transmise comme un argument à une autre fonction, qui est ensuite exécutée une fois l'opération asynchrone terminée. Cette pièce "After" est cruciale car l'opération asynchrone ne bloque pas le fil principal.

Voyons un exemple simple de récupération des données d'une API:

 <code class="javascript">function fetchData(url, callback) { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status >= 200 && xhr.status  { if (err) { console.error('Error fetching data:', err); } else { console.log('Data fetched:', data); } });</code>

Dans cet exemple, fetchData est une fonction asynchrone. La fonction callback est exécutée une fois les données récupérées (ou une erreur se produit). Le rappel reçoit deux arguments: un objet d'erreur (ou null en cas de succès) et les données (ou null si une erreur s'est produite). Ce schéma, bien que fonctionnel, peut conduire à «l'enfer de rappel» avec des rappels profondément imbriqués lorsqu'ils traitent de multiples opérations asynchrones.

Travailler avec JavaScript asynchrone en utilisant des promesses

Les promesses offrent un moyen plus structuré et plus propre de gérer les opérations asynchrones. Une promesse représente le résultat éventuel d'une opération asynchrone, qui peut être soit une valeur résolue, soit une raison rejetée (erreur).

 <code class="javascript">function fetchDataPromise(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status >= 200 && xhr.status  console.log('Data fetched:', data)) .catch(err => console.error('Error fetching data:', err));</code>

Ici, fetchDataPromise renvoie une promesse. La méthode .then() gère la valeur résolue (succès) et la méthode .catch() gère la raison rejetée (erreur). Les promesses rendent le code asynchrone plus facile à lire et à maintenir, en évitant le problème de nidification des rappels.

Travailler avec JavaScript asynchrone en utilisant Async / Await

Async / Await s'appuie sur les promesses, offrant un style plus synchrone pour écrire du code asynchrone. Le mot-clé async déclare une fonction asynchrone, et le mot-clé await s'arrête à l'exécution jusqu'à ce qu'une promesse se résout.

 <code class="javascript">async function fetchDataAsync(url) { try { const response = await fetch(url); if (!response.ok) { throw new Error(`Request failed with status ${response.status}`); } const data = await response.json(); return data; } catch (err) { console.error('Error fetching data:', err); throw err; // Re-throw the error for handling further up the call stack } } fetchDataAsync('https://api.example.com/data') .then(data => console.log('Data fetched:', data)) .catch(err => console.error('Error handling:', err));</code>

fetchDataAsync est une fonction asynchrone. await attend la promesse de fetch de résoudre avant de continuer. L' try...catch gère les erreurs potentielles. Async / Await fait du code asynchrone en lecture comme un code synchrone, améliorant considérablement la lisibilité et la maintenabilité.

Quelles sont les principales différences entre les rappels, les promesses et les asynchrones / attendre dans la gestion des opérations asynchrones en JavaScript?

Les rappels sont l'approche la plus élémentaire, souffrant de «l'enfer de rappel» en raison de structures imbriquées. Les promesses offrent un moyen plus structuré en utilisant .then() et .catch() , améliorant la lisibilité. Async / Await s'appuie sur les promesses, fournissant une syntaxe plus propre et synchrone en utilisant async et await , améliorant davantage la lisibilité et la maintenabilité. Async / Await ne change pas fondamentalement la façon dont les opérations asynchrones sont traitées; C'est du sucre syntaxique construit sur les promesses. La principale différence réside dans la façon dont le code est écrit et sa lisibilité, et non sur le mécanisme sous-jacent.

Comment puis-je choisir la meilleure approche (rappels, promesses ou asynchrones / attendre) pour gérer le code JavaScript asynchrone dans différents scénarios?

  • Rappels: généralement évité à moins de travailler avec le code hérité ou des scénarios très simples. La complexité dégénère rapidement avec de multiples opérations asynchrones.
  • Promesses: Un bon choix pour la plupart des opérations asynchrones. Ils fournissent un moyen structuré et gérable de gérer le code asynchrone, en particulier lorsqu'ils traitent avec plusieurs opérations enchaînées.
  • Async / Await: L'approche préférée pour la plupart des projets JavaScript modernes. Il améliore la lisibilité et rend le code asynchrone plus facile à comprendre et à maintenir, en particulier dans des scénarios complexes. Cependant, il repose sur des promesses sous le capot.

Quels sont les pièges courants à éviter lorsque vous utilisez des rappels, des promesses et des asynchrones / attendre pour le JavaScript asynchrone?

  • Hellback Hell (rappel): Évitez les rappels profondément imbriqués. Utilisez des promesses ou asynchrones / attendre pour améliorer la lisibilité.
  • Rejection des promesses non gérées (Promises & Async / Await): Gérez toujours les erreurs potentielles en utilisant .catch() ou try...catch Blocks. Les rejets non perdus peuvent entraîner des échecs silencieux.
  • Ignorer la gestion des erreurs (les trois): implémentez toujours une gestion robuste des erreurs. Vérifiez les erreurs à chaque étape de l'opération asynchrone.
  • Asynchronisation / attente de surutilisation (asynchronisation / attendre): Bien que l'async / attente améliore la lisibilité, la surutilisation peut conduire à une complexité inutile. L'utilisez judicieusement.
  • Conditions de course (toutes les trois): soyez conscient des conditions de course, où l'ordre des opérations asynchrones est importante. Des mécanismes de synchronisation appropriés peuvent être nécessaires dans de tels cas.
  • Des impasses (toutes les trois): Dans des scénarios complexes avec de multiples opérations asynchrones, soyez prudent quant à des impasses, où deux opérations ou plus sont bloquées indéfiniment.

En comprenant ces approches et leurs pièges, vous pouvez écrire un code JavaScript asynchrone efficace, lisible et maintenable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn