Maison >interface Web >js tutoriel >Async Made Easy : une plongée approfondie dans les rappels, les promesses et l'Async/Await JavaScript

Async Made Easy : une plongée approfondie dans les rappels, les promesses et l'Async/Await JavaScript

WBOY
WBOYoriginal
2024-08-17 11:30:021267parcourir

Async Made Easy: A Deep Dive into JavaScript Callbacks, Promises, and Async/Await

JavaScript est un langage monothread, ce qui signifie qu'il peut exécuter une tâche à la fois. Cependant, grâce à la boucle d'événements, il peut gérer efficacement les opérations asynchrones telles que la récupération de données, la lecture de fichiers ou la gestion des interactions utilisateur, en garantissant que ces tâches ne bloquent pas le thread principal. Cependant, les applications Web doivent souvent effectuer plusieurs opérations simultanément, telles que récupérer des données à partir d'une API, lire des fichiers ou gérer les interactions des utilisateurs. Pour gérer ces tâches efficacement sans bloquer le thread principal, JavaScript utilise des techniques de programmation asynchrone. Dans cet article, nous approfondirons les concepts fondamentaux du JavaScript asynchrone : rappels, promesses et Async/Await. Comprendre ces concepts est essentiel pour créer des applications Web réactives et performantes. Nous explorerons chaque concept étape par étape avec des exemples détaillés pour vous aider à comprendre comment les mettre en œuvre efficacement.

Introduction à la programmation asynchrone

La programmation asynchrone permet à votre code d'effectuer d'autres tâches en attendant la fin des opérations de longue durée. Ceci est crucial pour créer des applications Web réactives. Décomposons les trois méthodes principales utilisées en JavaScript pour la programmation asynchrone :

  1. Rappels
  2. Promesses
  3. Async/Attendre

Chaque méthode a ses propres avantages et inconvénients. Comprendre ces méthodes vous aidera à choisir la bonne approche pour votre cas d'utilisation spécifique.

Rappels

Que sont les rappels ?

Un rappel est une fonction qui est passée en argument à une autre fonction et est exécutée une fois cette fonction terminée. Les rappels sont un concept fondamental en JavaScript, largement utilisé dans la programmation asynchrone, la gestion des événements, etc. Les rappels sont l'une des premières méthodes utilisées en JavaScript pour gérer les opérations asynchrones.

Exemple de rappels

Commençons par un exemple simple de fonction de rappel :

function fetchData(callback) {
    setTimeout(() => {
        const data = { name: 'John', age: 30 };
        callback(data);
    }, 2000);
}

function displayData(data) {
    console.log(`Name: ${data.name}, Age: ${data.age}`);
}

fetchData(displayData);

Dans cet exemple, fetchData simule une opération asynchrone à l'aide de setTimeout. Une fois l'opération terminée, elle appelle la fonction displayData avec les données récupérées.

Le problème des rappels : l'enfer des rappels

Bien que les rappels soient simples, ils peuvent conduire à un code profondément imbriqué lorsqu'il s'agit de plusieurs opérations asynchrones, un phénomène connu sous le nom de « l'enfer des rappels » ou de « pyramide du malheur ».

function fetchData(callback) {
    setTimeout(() => {
        const data = { name: 'John', age: 30 };
        callback(data);
    }, 2000);
}

function fetchMoreData(data, callback) {
    setTimeout(() => {
        data.job = 'Developer';
        callback(data);
    }, 2000);
}

function displayData(data) {
    console.log(`Name: ${data.name}, Age: ${data.age}, Job: ${data.job}`);
}

fetchData((data) => {
    fetchMoreData(data, (updatedData) => {
        displayData(updatedData);
    });
});

Comme vous pouvez le constater, les rappels imbriqués rendent le code plus difficile à lire et à maintenir.

Promesses

Que sont les promesses ?

Des promesses ont été introduites pour résoudre les problèmes associés aux rappels. Une promesse est un objet représentant l’achèvement ou l’échec éventuel d’une opération asynchrone. Les promesses ont trois états : en attente (état initial), remplie (opération terminée avec succès) et rejetée (échec de l'opération). Il vous permet d'enchaîner les opérations, rendant votre code plus lisible.

Exemple de promesses

Voici comment réécrire l'exemple précédent en utilisant des promesses :

function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            const data = { name: 'John', age: 30 };
            resolve(data);
        }, 2000);
    });
}

function fetchMoreData(data) {
    return new Promise((resolve) => {
        setTimeout(() => {
            data.job = 'Developer';
            resolve(data);
        }, 2000);
    });
}

fetchData()
    .then((data) => fetchMoreData(data))
    .then((updatedData) => {
        console.log(`Name: ${updatedData.name}, Age: ${updatedData.age}, Job: ${updatedData.job}`);
    });

Dans cet exemple, chaque opération asynchrone renvoie une promesse, et la méthode then est utilisée pour enchaîner les opérations.

Gestion des erreurs avec les promesses

Les promesses facilitent également la gestion des erreurs. Vous pouvez utiliser la méthode catch pour gérer les erreurs dans une chaîne d'opérations asynchrones :

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const success = true; // Simulate a success or failure
            if (success) {
                const data = { name: 'John', age: 30 };
                resolve(data);
            } else {
                reject('Failed to fetch data');
            }
        }, 2000);
    });
}

fetchData()
    .then((data) => {
        console.log(data);
    })
    .catch((error) => {
        console.error(error);
    });

Asynchrone/Attente

Qu'est-ce que Async/Await ?

Async/Await est un sucre syntaxique construit sur des promesses, introduit dans ES2017 (ES8). Il vous permet d'écrire du code asynchrone de manière synchrone, améliorant considérablement la lisibilité et simplifiant le flux de contrôle, en particulier lorsqu'il s'agit de plusieurs opérations asynchrones. Il vous permet d'écrire du code asynchrone de manière synchrone, le rendant plus lisible et plus facile à déboguer.

Exemple d'Async/Await

Convertissons notre exemple basé sur une promesse pour utiliser async/await :

function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            const data = { name: 'John', age: 30 };
            resolve(data);
        }, 2000);
    });
}

function fetchMoreData(data) {
    return new Promise((resolve) => {
        setTimeout(() => {
            data.job = 'Developer';
            resolve(data);
        }, 2000);
    });
}

async function displayData() {
    try {
        const data = await fetchData();
        const updatedData = await fetchMoreData(data);
        console.log(`Name: ${updatedData.name}, Age: ${updatedData.age}, Job: ${updatedData.job}`);
    } catch (error) {
        console.error(error);
    }
}

displayData();

Gestion des erreurs avec Async/Await

La gestion des erreurs dans async/await est simple. Vous pouvez utiliser des blocs try/catch pour gérer les erreurs :

async function displayData() {
    try {
        const data = await fetchData();
        const updatedData = await fetchMoreData(data);
        console.log(`Name: ${updatedData.name}, Age: ${updatedData.age}, Job: ${updatedData.job}`);
    } catch (error) {
        console.error(error);
    }
}

displayData();

Comparaison des rappels, des promesses et des asynchrones/attentes

Lisibilité

  • Callbacks: Callbacks: Can lead to callback hell, making the code difficult to read, maintain, and debug, often resulting in error-prone code.
  • Promises: Improve readability by allowing you to chain operations.
  • Async/Await: Provides the best readability by allowing you to write asynchronous code in a synchronous manner.

Error Handling

  • Callbacks: Callbacks: Error handling is more cumbersome and often involves passing error objects through multiple layers of callbacks, leading to complex and hard-to-manage code. Promises and async/await simplify this process by providing more streamlined and centralized error handling mechanisms.
  • Promises: Simplifies error handling with the catch method.
  • Async/Await: Makes error handling even simpler with try/catch blocks.

Use Cases

  • Callbacks: Suitable for simple, single asynchronous operations.
  • Promises: Ideal for chaining multiple asynchronous operations.
  • Async/Await: Best for complex asynchronous operations and when readability is a priority.

FAQs

What Is the Main Advantage of Using Promises Over Callbacks?

The main advantage of using promises over callbacks is improved readability and maintainability of the code. Promises avoid the nested structure of callbacks, making the code more linear and easier to follow.

Can I Use Async/Await with Older Browsers?

Async/await is supported in most modern browsers. However, for older browsers, you may need to use a transpiler like Babel to convert your async/await code to ES5.

How Do I Handle Multiple Promises Concurrently?

You can use Promise.all to handle multiple promises concurrently. For example:

const promise1 = fetchData();
const promise2 = fetchMoreData(data);

Promise.all([promise1, promise2])
    .then((results) => {
        const [data, moreData] = results;
        console.log(data, moreData);
    })
    .catch((error) => {
        console.error(error);
    });

Is Async/Await Always Better Than Promises?

Async/await is generally more readable than promises, but promises can be more appropriate in certain scenarios, such as when dealing with multiple concurrent operations.

How Do I Cancel an Asynchronous Operation?

JavaScript doesn't natively support canceling promises. However, you can use techniques like AbortController for fetch requests or implement your own cancellation logic.

Conclusion

Asynchronous programming is a fundamental aspect of JavaScript that allows you to build responsive and efficient web applications. Understanding the differences between callbacks, promises, and async/await is crucial for writing clean, maintainable code. By mastering callbacks, promises, and async/await, and understanding when to use each, you can significantly improve the readability, maintainability, and performance of your applications. This knowledge will empower you to tackle any asynchronous challenge with confidence and efficiency. Whether you choose callbacks for simple tasks, promises for chaining operations, or async/await for readability, mastering these concepts will make you a more effective JavaScript developer.

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