Qual é a diferença entre Promises e Observables no Angular?

Eu venho visto muitos códigos que usam as duas coisas, mas queria saber qual é a diferença entre promises e observables no Angular. Quando uso um e quando uso o outro?

Promises

Uma promise, ou promessa, manipula um único evento quando uma operação assíncrona é concluída ou falha.

Nota: Existem bibliotecas Promise que suportam o cancelamento, mas o ES6 Promise ainda não suporta.

Observable

Um Observable é como um Stream (em muitas linguagens) e permite passar zero ou mais eventos onde o callback é chamado para cada evento.

Muitas vezes, o Observable é preferível ao Promise porque fornece os recursos do Promise e muito mais. Com o Observable, não importa se você deseja manipular 0, 1 ou vários eventos. Você pode utilizar a mesma API em cada caso.

Observable também tem a vantagem de ser cancelável sobre o Promise. Se o resultado de uma solicitação HTTP para um servidor ou alguma outra operação assíncrona pesada não for mais necessária, o Subscription de um Observable permite cancelar a assinatura, enquanto uma Promise eventualmente chamará o retorno de chamada de sucesso ou falha, mesmo quando você não precisa mais da notificação ou do resultado que ela fornece. Enquanto um Promise começa imediatamente, um Observable` só começa se você se inscrever nele. É por isso que são chamados de preguiçosos.

Observable fornece operadores como map, forEach, reduce, … semelhante a um array. Existem também operadores poderosos como retry(), ou replay(), … que geralmente são bastante úteis.

A execução preguiçosa permite construir uma cadeia de operadores antes que o Observable seja executado por assinatura, para fazer um tipo de programação mais declarativa.

Qual é a diferença entre Promises e Observables no uso real?

Se você quiser usar o estilo reativo, basta usar Observables sempre. Se você tiver apenas Observables, poderá compor facilmente. Se você misturá-los, o código não fica mais tão limpo. Se você não se importa com o estilo reativo, você pode usar Promises para eventos únicos em que não se importa com canceláveis e observáveis para streams de eventos.

Com o ES7, é possível criar código assíncrono sem a necessidade de criar funções de callback, mas para ser possível usar este tipo de código com Observable, é necessário transformar essa função numa Promise e aí só um valor de retorno é permitido. Essa atualização deixou o código de Promises muito mais simples e parecido com código síncrono, através do uso de async e await no código.