Programmation asynchrone en JavaScript (applications du Windows Store)

JavaScript est un langage monothread. Cela signifie que l’appel d’un processus de longue durée bloque toute exécution tant que ce processus n’est pas terminé. Les éléments d’interface utilisateur cessent de répondre, les animations sont suspendues et aucun autre code de l’application ne peut s’exécuter. Pour résoudre ce problème, il faut éviter, autant que possible, l’exécution synchrone.

Une manière de procéder consiste à différer l’exécution d’une fonction, comme avec les gestionnaires d’événements, qui sont appelés une fois qu’un autre appel a déclenché un événement. Les fonctions de rappel sont un autre genre de traitement asynchrone, car elles rappellent le code qui a initié le processus.

Problèmes liés à l’utilisation de la programmation asynchrone

La programmation asynchrone peut rapidement devenir complexe. Un grand nombre des API JavaScript standard reposent fortement sur des rappels, lesquels sont souvent imbriqués, ce qui rend leur débogage difficile. En outre, la lecture de la pile des appels peut poser problème en raison de l’utilisation de fonctions inline anonymes. Les exceptions qui sont levées à partir d’un ensemble de rappels fortement imbriqués risquent de ne pas être propagées jusqu’à une fonction qui a initié la chaîne. Cela rend difficile l’identification de l’endroit exact où se cache un bogue.

Programmation asynchrone dans les applications du Windows Store qui utilisent JavaScript

Windows Runtime et la Bibliothèque Windows pour JavaScript proposent une façon de régler ces problèmes en implémentant la proposition Promises/A Common JS. Un objet promise retourne une valeur à un moment donné dans le futur. Vous pouvez utiliser ces objets pour construire des chaînes de code asynchrone qui sont plus faciles à lire.

Toutes les API Windows Runtime qui sont exposées à des applications du Windows Store sont encapsulées dans des objets promise. Cela vous permet d’utiliser des API Windows Runtime d’une façon qui vous est familière. Les promesses dans WinJS sont importantes, car de nombreuses interactions avec Windows Runtime sont asynchrones.

Description des promesses

Une promesse est un objet. La méthode la plus fréquemment utilisée sur un objet promise est then, qui prend trois paramètres : une fonction à appeler quand la promesse se termine correctement, une fonction à appeler quand la promesse se termine avec une erreur et une fonction pour fournir des informations sur l’avancement. Dans Windows Runtime et WinJS, vous pouvez également utiliser la fonction done, qui prend les mêmes paramètres. La différence est que dans le cas d’une erreur dans le traitement, la fonction then retourne une promesse dans un état d’erreur, mais ne lève pas d’exception, tandis que la méthode done lève une exception si aucune fonction d’erreur n’est fournie.

Observons un exemple simple d’une promesse avec deux méthodes asynchrones (inventées) : une pour appeler un service Web et une autre pour stocker les résultats dans une base de données.


myWebService.get("http://www.example.com")
    .then(function(result) { 
        return myDb.add(result); 
    })
    .then(function() {
        console.log('data successfully saved');
    }, function(error) {
        console.log('an error occurred while saving:');
        console.dir(error);
    });


Vous ajoutez la fonction then à la méthode myWebService.get. Étant donné que cette méthode retourne une promesse, vous pouvez ajouter une deuxième fonction then à la méthode myDb.add, et gérer toutes les erreurs dans la fonction d’erreur que vous passez à la deuxième fonction then.

Vous pouvez également regrouper plusieurs promesses. Par exemple, vous pouvez utiliser la fonction join pour exécuter plusieurs opérations asynchrones qui appellent plusieurs services Web, puis agréger les résultats.


function loadData() {
    var urls = [
        'http://www.example.com/',
        'http://www.example.org/',
        'http://www.example.net'
        ];
        
    var promises = urls.map(function (url) {
        return myWebService.get(url);
    });

    WinJS.Promise.join(promises).then(function () {
        //do the aggregation here.
    });
}


Nous créons d’abord un tableau d’URL, puis nous utilisons la fonction Array.map pour convertir le tableau d’URL en tableau de promesses (car l’élément mywebService.get retourne une promesse). Enfin, nous utilisons la fonction join, qui accepte un tableau de promesses et retourne une nouvelle promesse une fois toutes les promesses terminées. Nous effectuons l’agrégation des données dans la fonction complète de la méthode then.

Rubriques associées

Démarrage rapide : utilisation de promesses
Comment traiter les erreurs liées aux promesses
Résolution des erreurs WinRT
Promesses en chaîne
Gestion de plusieurs promesses

 

 

Afficher:
© 2014 Microsoft. Tous droits réservés.