TechTalk#13 – Promises iOS / Android

 

TechTalk #13

Promises iOS / Android

 

Les promises, iOS comme Android, adressent le problème de récupération d’un ou plusieurs résultat(s) d’appels asynchrones (ex: appel réseau, calcul long,…).

En objective C, le pattern historiquement utilisé dans les années 80 était la délégation. Autour de 2010, on utilisait le GCD avec des completion blocks. Le premier posait des problèmes de corrélation entre le code appelant et le résultat tandis que le deuxième rend difficile la coordination entre différents appels asynchrones. De même, en 2016, avec NodeJS l’utilisation des callbacks rend le code difficilement lisible à cause du code « indenté en cascade » que cela produit.

Une promise est une référence sur un résultat future d’une tâche. Plusieurs promises peuvent être combinées pour obtenir les résultats de plusieurs tâches en gérant leur interdépendance. Une promise part d’un état initial « pending » et ne peut résulter que dans trois états : Rejété (cas d’une erreur), Canceled ou Resolved.

Les promises peuvent être combinées de manière séquentielle(une après l’autre) ou simultanée ou encore des 2 manières combinées. L’écriture de l’appel des promises permet de les « chainer » : on évite l’appel de la seconde promise dans le block de la première en utilisant la méthode then(), ce qui linéarise le code (pas de code indenté en cascade).

Un block de promise ne peut que :
– retourner un résultat de n’importe quel type
– ou retourner une promise de n’importe quel type (chainage)
– ou thrower une exception (Error en Swift)

L’implémentation des promises peut se penser en termes de try / catch / finally des exceptions. En Swift, les mot-clés sont then / catch / always.

On peut annuler une promise en appelant sa méthode cancel(). Dans ce cas, le block du catch ne sera pas appelé tandis que le block du always sera appelé.

Et pour aller plus loin, voici quelques patterns avec les promises :

– L’utilisation des promises rend les callbacks sont propres. On identifie les différents cas : result, error et always.
– On peut fallbacker sur les données locales lorsque un appel réseau échoue.
– On peut réutiliser une promise en cours de traitement et « s’enregistrer » pour la réception de son résultat plutôt que d’en créer une nouvelle.
– On peut synchroniser des promises via l’utilisation de la méthode when().

Attention: les promises ne servent pas à résoudre toutes les problématiques, notamment pour les flux d’événements, les calculs synchrones, le message passing.

TechTalk animé par Olivier Tabone | Co-fondateur Directeur Technique chez Ripple Motion