Qual é a diferença entre Promise
e Observable
em Angular?
Um exemplo em cada um seria útil para entender os dois casos. Em que cenário podemos usar cada caso?
Qual é a diferença entre Promise
e Observable
em Angular?
Um exemplo em cada um seria útil para entender os dois casos. Em que cenário podemos usar cada caso?
Respostas:
Promessa
A
Promise
lida com um único evento quando uma operação assíncrona é concluída ou falha.Nota: Existem
Promise
bibliotecas por aí que oferecem suporte ao cancelamento, mas o ES6Promise
ainda não.Observável
An
Observable
é como umStream
(em muitos idiomas) e permite passar zero ou mais eventos nos quais o retorno de chamada é chamado para cada evento.Geralmente,
Observable
é preferível aoPromise
invés de fornecer os recursosPromise
e muito mais. ComObservable
isso, não importa se você deseja lidar com 0, 1 ou vários eventos. Você pode utilizar a mesma API em cada caso.Observable
também tem a vantagemPromise
de ser cancelável . Se o resultado de uma solicitação HTTP para um servidor ou alguma outra operação assíncrona cara não for mais necessário, oSubscription
de anObservable
permitirá cancelar a assinatura, enquanto umPromise
eventualmente chamará o retorno de retorno bem-sucedido ou com falha, mesmo quando você não precisa da notificação ou o resultado que ele fornece mais.Observável fornece operadores como
map
,forEach
,reduce
, ... semelhantes a um arrayTambém existem operadores poderosos como
retry()
, oureplay()
, ... que geralmente são bastante úteis.fonte
Promise
, junto comasync
/await
torna seu código plano novamente! Na maioria das situações, e em projetos que não lidam com ciência de foguetes, não há necessidade de escrever essas funções aninhadas horríveis com cadeias de métodos desnecessariamente complicadas. Você pode usarasync
/await
today com transpilers, comoTypeScript
e escrever código plano legível por humanos real sem qualquer um dosrxjs
padrões. Você provavelmente ainda precisará,rxjs
algumas vezes, em situações selecionadas, porque realmente tem muitas coisas a oferecer.Ambos
Promises
eObservables
nos fornecem abstrações que nos ajudam a lidar com a natureza assíncrona de nossos aplicativos. A diferença entre eles foi apontada claramente por @ Günter e @Relu.Como um trecho de código vale mais que mil palavras, vamos seguir o exemplo abaixo para entendê-las mais facilmente.
Angular usa Rx.js Observables em vez de promessas para lidar com HTTP.
Suponha que você esteja criando uma função de pesquisa que mostre resultados instantaneamente enquanto você digita. Parece familiar, mas há muitos desafios que acompanham essa tarefa.
HTTP
solicitações. Basicamente, queremos apenas pressioná-lo quando o usuário parar de digitar em vez de pressionar cada tecla.A demonstração consiste simplesmente em dois arquivos:
app.ts
ewikipedia-service.ts
. Em um cenário do mundo real, provavelmente dividiríamos ainda mais as coisas.Abaixo está a implementação baseada em promessa que não lida com nenhum dos casos extremos descritos.
wikipedia-service.ts
Estamos injetando o
Jsonp
serviço para fazer umaGET
solicitação na API da Wikipedia com um determinado termo de pesquisa. Observe que chamamostoPromise
para passar de umObservable<Response>
para umPromise<Response>
. Eventualmente, acabam com aPromise<Array<string>>
como o tipo de retorno do nosso método de pesquisa.app.ts
Não é muita surpresa aqui também. Injetamos nossa
WikipediaService
e expomos sua funcionalidade por meio de um método de pesquisa ao modelo. O modelo simplesmente liga-se a keyup e chamadassearch(term.value)
.Desembrulhamos o resultado da Promessa de que o método de pesquisa do WikipediaService retorna e o expomos como uma Matriz simples de seqüências de caracteres para o modelo, para que possamos fazer um
*ngFor
loop e criar uma lista para nós.Veja o exemplo de implementação baseada em promessa no Plunker
Onde os Observáveis realmente brilham
Vamos alterar nosso código para não martelar o ponto final a cada pressionamento de tecla, mas enviar apenas uma solicitação quando o usuário parar de digitar por 400 ms
Para revelar essas superpotências, primeiro precisamos obter um
Observable<string>
que carregue o termo de pesquisa digitado pelo usuário. Em vez de vincular manualmente ao evento keyup, podemos tirar proveito daformControl
diretiva da Angular . Para usar essa diretiva, primeiro precisamos importar o arquivo para oReactiveFormsModule
nosso módulo de aplicativo.app.ts
Uma vez importados, podemos usar o formControl de dentro do nosso modelo e defini-lo com o nome "termo".
Em nosso componente, criamos uma instância de
FormControl
from@angular/form
e a expomos como um campo sob o termo de nome em nosso componente.Nos bastidores, o termo expõe automaticamente uma
Observable<string>
propriedade asvalueChanges
que podemos assinar. Agora que temos umaObservable<string>
, superar a entrada do usuário é tão fácil quanto ligardebounceTime(400)
para a nossaObservable
. Isso retornará um novoObservable<string>
que somente emitirá um novo valor quando não houver novos valores por 400ms.Seria um desperdício de recursos enviar outra solicitação de um termo de pesquisa para o qual nosso aplicativo já mostra os resultados. Tudo o que precisamos fazer para alcançar o comportamento desejado é ligar para o
distinctUntilChanged
operador logo depois que ligamosdebounceTime(400)
Veja o exemplo de implementação observável no Plunker
Quanto ao uso do Http no Angular, concordo que nos casos de uso normais não há muita diferença ao usar o Observable over Promise. Nenhuma das vantagens é realmente relevante aqui na prática. Espero ver alguns casos de uso avançados no futuro :)
fonte
Ambas as promessas e observáveis nos ajudará a trabalhar com as funcionalidades assíncronas em JavaScript. Eles são muito semelhantes em muitos casos, no entanto, ainda existem algumas diferenças entre os dois, promessas são valores que serão resolvidos de
asynchronous
maneiras como chamadas http . Por outro lado, os observáveis lidam com uma sequência de eventos assíncronos . As principais diferenças entre eles estão listadas abaixo:promessa:
observável:
Além disso, criei a imagem gráfica para você abaixo para mostrar as diferenças visualmente:
fonte
Promise
é a maneira errada de pensar sobre como promete. É dePromise
responsabilidade apenas lidar com sucesso ou falha de maneira assíncrona compatível. Se você deseja cancelar uma solicitação http, cancela a solicitação, não a promessa, e faz com que o resultado do cancelamento cumpra ou rejeite a Promessa. jsfiddle.net/greggman/ea0yhd4pPromessas
Observáveis
Uma nova tentativa do operador pode ser usada para repetir sempre que necessário, também se precisarmos repetir o observável com base em algumas condições . podem ser usados.
Nota : Uma lista de operadores, juntamente com seus diagramas interativos, está disponível aqui em RxMarbles.com
fonte
Há uma desvantagem do Observables ausente nas respostas. As promessas permitem usar as funções de assíncrona / espera do ES7. Com eles, você pode escrever código assíncrono como se fosse uma chamada de função síncrona, para que você não precise mais de retornos de chamada. A única possibilidade dos Observables fazerem isso é convertê-los em Promessas. Mas quando você as converte em Promessas, você pode ter apenas um valor de retorno novamente:
Leitura adicional: Como posso aguardar em um Rx Observable?
fonte
Promessas e Observáveis tratam apenas da chamada assíncrona.
Aqui estão as diferenças entre eles:
Observável
Promessa
Emite apenas um único valor de cada vez
Chama os serviços sem .then e .catch
Não pode ser cancelado
Não fornece nenhum operador
fonte
Mesmo que essa resposta esteja atrasada, eu resumi as diferenças abaixo,
Observável:
function
que pegaan observer
e retorna umfunction Observer: an object with next, error.
subscribe/unsubscribe
seu fluxo de dados, emitir o próximo valor para o observador,notify
o observadorerrors
e informar o observador sobre ostream completion
function to handle next value
, erros e fim do fluxo (eventos da interface do usuário, respostas http, dados com soquetes da web).multiple values
o tempocancel-able/retry-able
e suporta operadores comomap,filter,reduce
etc.Observable.create()
- retorna Observable que pode chamar métodos em -Observer Observable.from()
- converte uma matriz ou iterável em -Observable Observable.fromEvent()
- converte um evento em Observable -Observable.fromPromise()
- converte uma Promessa em Observable -Observable.range()
- retorna uma sequência de números inteiros no intervalo especificadoPromessa :
Uma promessa representa uma tarefa que terminará no futuro;
Promessas se tornam
resolved by a value
;As promessas são rejeitadas por exceções;
Não
cancellable
e retornaa single value
Uma promessa expõe uma função
(then)
-Então retorna um novo
promise
;- permite que o
attachment
que seja executado com base emstate
;-
handlers
devemguaranteed
executar dentroorder attached
;fonte
Acabei de lidar com um problema em que o Promises era a melhor solução e estou compartilhando aqui para qualquer um que se depare com essa questão, caso ela seja útil (essa era exatamente a resposta que eu estava procurando anteriormente):
Em um projeto Angular2, tenho um serviço que usa alguns parâmetros e retorna uma lista de valores para preencher os menus suspensos em um formulário. Quando o componente do formulário é inicializado, preciso chamar o mesmo serviço várias vezes com parâmetros diferentes para definir vários menus suspensos diferentes; no entanto, se eu simplesmente enfileirar todas as variáveis para chamar o serviço, apenas o último é bem-sucedido e o erro restante Fora. A busca do serviço no banco de dados pode lidar apenas com uma solicitação por vez.
A única maneira de preencher com êxito todas as variáveis do menu suspenso era chamar o serviço de maneira a impedir que uma nova solicitação fosse processada até a última solicitação ser concluída, e o mecanismo Promise / .then resolveu o problema de maneira adequada.
Eu defini as funções no componente e, em seguida, chamei initializeDropDowns () em ngOnInit.
A função fetchValueList retorna uma Promise; portanto, a primeira chamada passa o primeiro listCode e, quando a Promise é resolvida, o valor de retorno está na variável de dados no bloco .then, onde podemos atribuí-lo à variável this.firstValList. Como a função retornou dados, sabemos que o serviço foi concluído e é seguro chamar novamente com o segundo listCode, o valor de retorno está na variável de dados no próximo bloco .then e o atribuímos à variável this.secondValList.
Podemos encadear isso quantas vezes for necessário para preencher todas as variáveis e, no último bloco de código, simplesmente omitimos a instrução de retorno e o bloco termina.
Esse é um caso de uso muito específico, em que temos um único serviço que precisa ser chamado várias vezes quando o componente é inicializado e em que o serviço precisa concluir sua busca e retornar um valor antes de poder ser chamado novamente, mas, neste caso, o método Promise / .then foi ideal.
fonte
scan()
para criar um fluxo de observáveis seqüenciais. No entanto, sua abordagem talvez seja mais explícita e mais fácil de entender.Acredito que todas as outras respostas devem esclarecer suas dúvidas. No entanto, eu só queria acrescentar que os observáveis são baseados em programação funcional e acho muito úteis as funções que o acompanham, como map, flatmap, reduzir, zip. A consistência que a Web obtém, especialmente quando depende de solicitações de API, é uma melhoria brutal.
Eu recomendo fortemente esta documentação , pois é a documentação oficial do reactiveX e acho que é a mais clara existente.
Se você quiser entrar no observável, sugiro este post em três partes: http://blog.danlew.net/2014/09/09/15/grokking-rxjava-part-1/
Embora seja destinado ao RxJava, os conceitos são os mesmos e são muito bem explicados. Na documentação do reactiveX, você tem as equivalências para cada função. Você deve procurar pelo RxJS.
fonte
Promessa:
Observável:
Você pode usar promessas em vez de observáveis ao chamar HTTP em Angular, se desejar.
fonte
Visão geral:
Você sempre pode usar um observável para lidar com comportamento assíncrono, pois um observável tem todas as funcionalidades que uma promessa oferece (+ extra). No entanto, às vezes essa funcionalidade extra oferecida pelo Observables não é necessária. Seria uma sobrecarga extra importar uma biblioteca para usá-los.
Quando usar o Promises:
Use promessas quando tiver uma única operação assíncrona da qual deseja processar o resultado. Por exemplo:
Portanto, uma promessa executa algum código em que resolve ou rejeita. Se resolver ou rejeitar é chamado, a promessa passa de um estado pendente para um estado resolvido ou rejeitado . Quando o estado da promessa é resolvido, o
then()
método é chamado. Quando o estado da promessa é rejeitado, ocatch()
método é chamado.Quando usar Observables:
Use Observables quando houver um fluxo (de dados) ao longo do tempo que você precise manipular. Um fluxo é uma sequência de elementos de dados que estão sendo disponibilizados ao longo do tempo . Exemplos de fluxos são:
No próprio Observable é especificado quando o próximo evento ocorreu, quando ocorre um erro ou quando o Observable é concluído . Em seguida, podemos assinar esse observável, que o ativa e, nessa assinatura, podemos transmitir três retornos de chamada (nem sempre é necessário transmitir todos). Um retorno de chamada a ser executado para obter sucesso, um retorno de erro e um retorno de chamada para conclusão. Por exemplo:
Ao criar um observável, é necessária uma função de retorno de chamada que forneça um observador como argumento. Nesta observador, então você pode chamar
onNext
,onCompleted
,onError
. Então, quando o Observable estiver inscrito, ele chamará os retornos de chamada correspondentes passados para a assinatura.fonte
Promessa - Forneça um único valor futuro. Não preguiçoso . Não pode ser cancelado. Ele rejeitará ou resolverá.
Observável - Forneça vários valores futuros. Preguiçoso. Cancelável. Ele fornece outros métodos de mapa ao vivo, filtro, redução.
fonte
Promessa versus similaridade observável primeiro
Exemplo observável agora. Aqui também passamos uma função para observable, um observador para lidar com a tarefa assíncrona. Ao contrário da determinação na promessa, ele possui o método a seguir e se inscreve no lugar dele.
Então, ambos lidam com tarefas assíncronas. Agora vamos ver a diferença.
Promessa vs Diferença observável
Promessa
Observável
fonte
Below are some important differences in promises & Observables.
fonte
Uma promessa emite um único evento quando uma atividade assíncrona termina ou falha.
Um Observable é como um Stream (em vários idiomas) e permite passar pelo menos zero ou mais eventos nos quais o retorno de chamada é necessário para cada evento.
O Frequently Observable é preferido sobre o Promise, pois fornece os destaques do Promise e muito mais. Com Observable, não importa se você precisa lidar com 0, 1 ou vários eventos. Você pode usar a API semelhante para cada caso.
Promessa: promessa emite um valor único
Por exemplo:
Observável: emite vários valores ao longo de um período de tempo
Por exemplo:
podemos pensar em um observável como um fluxo que emite vários valores ao longo de um período de tempo e a mesma função de retorno de chamada é chamada para cada item emitido; portanto, com um observável, podemos usar a mesma API para manipular dados assíncronos. se esses dados são transmitidos como um valor único ou vários valores ao longo de um período de tempo.
Promessa:
Observável:
Promessas Angulares vs Observáveis
fonte
Promise emite um único valor, enquanto Observable emite vários valores. Portanto, ao lidar com uma solicitação HTTP, o Promise pode gerenciar uma única resposta para a mesma solicitação, mas e se houver várias respostas para a mesma solicitação, precisamos usar Observable. Sim, o Observable pode lidar com várias respostas para a mesma solicitação.
Promessa
Resultado
Observável
Resultado
fonte
Promessa
Observável
Para um melhor entendimento, consulte https://stackblitz.com/edit/observable-vs-promises
fonte
Vejo muitas pessoas usando o argumento de que Observable é "cancelável", mas é bastante trivial tornar a Promise "cancelável"
fonte
Resposta curta :
Observável é melhor , tem todos os recursos do Promises , além de recursos extras.
Resposta longa:
Promessas:
Observável:
fonte
Embora a resposta aceita seja boa em geral, não acho que enfatize que, ao lidar com componentes angulares, você quase sempre deseja usar um observável, porque ele suporta cancelamento. As promessas não podem ser canceladas e serão resolvidas mesmo que seu componente seja destruído. Angular tende a perdoar até que não seja.
Por exemplo, qualquer detecção manual de alterações em um componente destruído causará uma exceção:
Se o seu componente for destruído antes da promessa ser resolvida, você receberá um
attempt to use destroyed view
erro quando a promessa for resolvida.Como alternativa, se você usar observáveis com o padrão takeUntil , assim que seu componente for destruído, a assinatura será cancelada.
Este é um exemplo um pouco artificial, mas a execução de código para um componente destruído provavelmente levará a erros. A menos que você queira fazer isso por algum motivo: p
fonte
Algo que encontrei que não era aparente desde a primeira leitura do tutorial e da documentação foi a ideia do multicasting.
Certifique-se de que, por padrão, várias assinaturas acionarão várias execuções em um Observável. Várias assinaturas para uma única chamada HTTP Observable acionarão várias chamadas HTTP idênticas, a menos que você
.share()
(ative o multicast).Uma promessa obriga você a lidar com uma coisa de cada vez, desembrulhar seus dados, lidar com exceções, ter suporte a idiomas para coisas legais como assíncrono / aguardar e, por outro lado, é bastante barebones.
Um Observable tem muitos sinos e assobios, mas você precisa entender o poder com o qual está trabalhando ou pode ser mal utilizado.
fonte
Promessa:
Um manipulador de eventos assíncrono - O objeto Promise representa a conclusão (ou falha) final de uma operação assíncrona e seu valor resultante.
Sintaxe: nova promessa (executor);
Por exemplo:
Sobre a Promise: Possui um pipeline, portanto, ele retornará valores apenas uma vez quando for chamado. seu manipulador unidirecional chamado uma vez, talvez você não consiga cancelar. sintaxe útil que você pode brincar, quando () e depois ()
Observáveis:
Observáveis são coleções preguiçosas de vários valores ao longo do tempo. é realmente uma ótima abordagem para operações assíncronas. isso pode ser feito com o rxjs, que possui suporte para várias plataformas, pode usar com angular / react etc.
seu ato como forro de fluxo. pode ser multi pipeline. portanto, uma vez definido, você pode se inscrever para obter resultados de retorno em muitos lugares.
Sintaxe:
import * as Rx from "@reactivex/rxjs";
para init:etc
subscrever:
RxLogger.getInstance();
Por exemplo:
como ele suporta vários pipeline, você pode assinar o resultado em um local diferente, tem muitas possibilidades além das promessas.
Uso: tem mais possibilidades como
map, filter, pipe, map, concatMap etc
fonte
A diferença básica entre observável e promessas são:
fonte
Observáveis são frequentemente comparados com promessas. Aqui estão algumas diferenças importantes:
Observáveis são declarativos; o cálculo não inicia até a assinatura. As promessas são executadas imediatamente na criação. Isso torna os observáveis úteis para definir receitas que podem ser executadas sempre que você precisar do resultado.
Observáveis fornecem muitos valores. Promessas fornecem um. Isso torna os observáveis úteis para obter vários valores ao longo do tempo.
Observáveis diferenciam entre encadeamento e assinatura. Promessas possuem apenas cláusulas .then (). Isso torna os observáveis úteis para criar receitas de transformação complexas a serem usadas por outras partes do sistema, sem causar a execução do trabalho.
Observables subscribe () é responsável por manipular erros. As promessas enviam erros às promessas da criança. Isso torna os observáveis úteis para o tratamento centralizado e previsível de erros.
Essa é a diferença mais simples que você pode encontrar nos documentos do ANGULAR.IO. resposta de descanso é dada pela maioria está correta em seu próprio lugar
fonte
As promessas são focadas apenas em valores únicos ou resoluções; os observáveis são o fluxo de dados.
Observáveis podem ser cancelados, mas promessas não podem ser canceladas.
O menos conhecido, pelo menos para mim é
fonte
fluxo de valores (de 0 a vários valores),
fonte
Observables e Promises estão nos ajudando a trabalhar com as funcionalidades assíncronas em JavaScript / typescript. Eles são muito semelhantes em muitos casos, no entanto, ainda existem algumas diferenças entre eles.
fonte
Já existem muitas respostas sobre esse tópico, portanto não adiciono uma redundante.
Mas para alguém que acabou de começar a aprender Observable / Angular e se pergunta qual deles usar em comparação com o Promise , eu recomendaria que você mantivesse tudo Observable e convertesse todas as Promessas existentes em seu projeto em Observable.
Simplesmente porque a própria estrutura Angular e sua comunidade estão usando o Observable. Portanto, seria benéfico quando você integrar serviços de estrutura ou módulos de terceiros e encadear tudo.
Embora eu aprecie todos os votos negativos, mas ainda insisto na minha opinião acima, a menos que alguém faça um comentário adequado para listar alguns cenários que ainda podem ser úteis no seu projeto Angular para usar Promessas por Observáveis.
É claro que nenhuma opinião é 100% correta em todos os casos, mas pelo menos acho que 98% do tempo para projetos comerciais regulares implementados na estrutura Angular, o Observable é o caminho certo a seguir.
Mesmo que você não goste no ponto de partida do seu projeto de hobby simples, em breve perceberá quase todos os componentes com os quais interage no Angular, e a maior parte da estrutura de terceiros amigável do Angular está usando o Observables, e então acabou convertendo constantemente sua promessa para observável para se comunicar com eles.
Esses componentes incluem, entre outros: HttpClient, Construtor de formulários, Módulos / caixas de diálogo de material angular, Armazenamento / efeitos do Ngrx e ngx-bootstrap.
De fato, a única promessa do ecossistema angular com que lidei nos últimos 2 anos é
APP_INITIALIZER
.fonte