Différences entre observable et promise

Angular 2 utilise RxJS, donc les observables. Mais quelles sont les différences entre promises et observables ?

Trois différences essentielles sont à noter :

  • un observable est 'lazy'. Tant que vous n'appelez pas subscribe() sur un observable que vous avez créé, le code que contient cet observable ne s'exécute pas. Alors qu'une promise, dès qu'elle est créée, est exécutée quoi qu'il arrive.

  • on peut annuler un observable. Un observable retourne une fonction qui comporte tout le code de nettoyage à exécuter si vous avez décidé de l'annuler. Une promise en revanche, une fois qu'elle est créée, ira jusqu'au bout sans possibilité de renoncer à son exécution une fois qu'elle a commencé à s'exécuter. C'est un peu étrange dans le cas des promises utilisées pour faire une requête AJAX puisque l'objet XMLHttpRequest sous-jacent possède une méthode abort(), mais c'est ainsi à ce jour, on ne peut pas appeler abort() quand on utilise une promise (un projet de "cancellable promise" est ceci dit en projet pour ES7 ou ES8)

  • un observable peut être répété. S'il a précédemmement échoué (en raison d'une erreur réseau par exemple), il peut réussir lors d'une nouvelle exécution future (à l'aide de retry()) plus tard. Tandis qu'une promise conserve en cache le résultat de sa première exécution.

Il sera fréquemment question de RxJS et des observables sur ce blog dans les semaines et les mois à venir, car le "reactive programming" (à ne surtout pas confondre avec le très populaire framework React), est une tendance montante dans le développement JavaScript contemporain.