Qual'è la differenza tra Promise
e Observable
in Angular?
Un esempio su ciascuno sarebbe utile per comprendere entrambi i casi. In quale scenario possiamo usare ogni caso?
Qual'è la differenza tra Promise
e Observable
in Angular?
Un esempio su ciascuno sarebbe utile per comprendere entrambi i casi. In quale scenario possiamo usare ogni caso?
Risposte:
Promettere
A Promise
gestisce un singolo evento quando un'operazione asincrona viene completata o ha esito negativo.
Nota: ci sono Promise
librerie là fuori che supportano la cancellazione, ma ES6 Promise
non è così lontano.
Osservabile
An Observable
è come un Stream
(in molte lingue) e consente di passare zero o più eventi in cui viene chiamato il callback per ogni evento.
Spesso Observable
è preferito Promise
perché fornisce le funzionalità di Promise
e altro ancora. Con Observable
esso non importa se si desidera gestire 0, 1 o più eventi. Puoi utilizzare la stessa API in ogni caso.
Observable
ha anche il vantaggio Promise
di essere cancellabile . Se il risultato di una richiesta HTTP a un server o qualche altra costosa operazione asincrona non è più necessario, Subscription
of of Observable
consente di annullare la sottoscrizione, mentre a Promise
alla fine chiamerà il successo o il callback non riuscito anche quando non è necessaria la notifica o il risultato che fornisce più.
Osservabile fornisce operatori come map
, forEach
, reduce
, ... simile a una matrice
Ci sono anche potenti operatori come retry()
, o replay()
, ... che sono spesso abbastanza utili.
Promise
, insieme a async
/ await
rende di nuovo il tuo codice piatto! Nella maggior parte delle situazioni e in progetti che non trattano di scienza missilistica, non è necessario scrivere quelle orribili funzioni annidate con catene di metodi inutilmente complicate. Puoi usare async
/ await
oggi con i transpiler, come TypeScript
, e scrivere un vero codice flat leggibile dall'uomo senza alcuna piastra della caldaia rxjs
. Probabilmente avrai ancora bisogno a rxjs
volte in determinate situazioni, perché ha davvero molte cose da offrire.
Entrambi Promises
e Observables
ci forniscono astrazioni che ci aiutano a gestire la natura asincrona delle nostre applicazioni. La differenza tra loro è stata chiaramente evidenziata da @ Günter e @Relu.
Poiché uno snippet di codice vale più di mille parole, passa attraverso l'esempio seguente per capirle più facilmente.
Grazie @Christoph Burgdorf per il fantastico articolo
Angular utilizza Rx.js Observables invece di promesse per gestire HTTP.
Supponiamo che tu stia creando una funzione di ricerca che dovrebbe mostrarti immediatamente i risultati durante la digitazione. Sembra familiare ma ci sono molte sfide che derivano da questo compito.
HTTP
richieste. Fondamentalmente, vogliamo colpirlo solo quando l'utente ha smesso di digitare invece che ad ogni pressione di un tasto.La demo consisterà semplicemente in due file: app.ts
e wikipedia-service.ts
. In uno scenario del mondo reale, molto probabilmente divideremmo le cose più in alto.
Di seguito è riportata un'implementazione basata su Promise che non gestisce nessuno dei casi limite descritti.
wikipedia-service.ts
import { Injectable } from '@angular/core';
import { URLSearchParams, Jsonp } from '@angular/http';
@Injectable()
export class WikipediaService {
constructor(private jsonp: Jsonp) {}
search (term: string) {
var search = new URLSearchParams()
search.set('action', 'opensearch');
search.set('search', term);
search.set('format', 'json');
return this.jsonp
.get('http://en.wikipedia.org/w/api.php?callback=JSONP_CALLBACK', { search })
.toPromise()
.then((response) => response.json()[1]);
}
}
Stiamo iniettando il Jsonp
servizio per effettuare una GET
richiesta all'API di Wikipedia con un determinato termine di ricerca. Si noti che chiamiamo toPromise
per passare da Observable<Response>
a a Promise<Response>
. Alla fine si finisce con un Promise<Array<string>>
come tipo di ritorno del nostro metodo di ricerca.
app.ts
// check the plnkr for the full list of imports
import {...} from '...';
@Component({
selector: 'my-app',
template: `
<div>
<h2>Wikipedia Search</h2>
<input #term type="text" (keyup)="search(term.value)">
<ul>
<li *ngFor="let item of items">{{item}}</li>
</ul>
</div>
`
})
export class AppComponent {
items: Array<string>;
constructor(private wikipediaService: WikipediaService) {}
search(term) {
this.wikipediaService.search(term)
.then(items => this.items = items);
}
}
Anche qui non c'è molta sorpresa. Iniettiamo la nostra WikipediaService
ed esponiamo la sua funzionalità tramite un metodo di ricerca al modello. Il modello si lega semplicemente al keyup e alle chiamate search(term.value)
.
Scartiamo il risultato della Promessa che il metodo di ricerca di WikipediaService ritorna e lo espone come un semplice array di stringhe al modello in modo da poterlo *ngFor
scorrere e costruire un elenco per noi.
Vedi l'esempio dell'implementazione basata su Promise su Plunker
Dove gli osservabili brillano davvero
Cambiamo il nostro codice per non martellare l'endpoint con ogni sequenza di tasti, ma inviamo invece una richiesta solo quando l'utente ha smesso di digitare per 400 ms
Per svelare tali superpoteri dobbiamo prima ottenere un termine Observable<string>
che contenga il termine di ricerca digitato dall'utente. Invece di associarlo manualmente all'evento keyup, possiamo trarre vantaggio dalla formControl
direttiva di Angular . Per utilizzare questa direttiva, dobbiamo prima importare ReactiveFormsModule
nel nostro modulo applicativo.
app.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { JsonpModule } from '@angular/http';
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [BrowserModule, JsonpModule, ReactiveFormsModule]
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}
Una volta importato, possiamo usare formControl dal nostro modello e impostarlo sul nome "termine".
<input type="text" [formControl]="term"/>
Nel nostro componente, creiamo un'istanza di FormControl
from @angular/form
e la esponiamo come un campo sotto il termine del nome sul nostro componente.
Dietro le quinte, il termine espone automaticamente una Observable<string>
proprietà come a valueChanges
cui possiamo abbonarci. Ora che abbiamo un Observable<string>
, superare l'input dell'utente è facile come chiamare debounceTime(400)
il nostro Observable
. Ciò restituirà un nuovo Observable<string>
che emetterà un nuovo valore solo quando non ci sono stati nuovi valori per 400 ms.
export class App {
items: Array<string>;
term = new FormControl();
constructor(private wikipediaService: WikipediaService) {
this.term.valueChanges
.debounceTime(400) // wait for 400ms pause in events
.distinctUntilChanged() // ignore if next search term is same as previous
.subscribe(term => this.wikipediaService.search(term).then(items => this.items = items));
}
}
Sarebbe uno spreco di risorse inviare un'altra richiesta per un termine di ricerca per cui la nostra app mostra già i risultati. Tutto quello che dobbiamo fare per raggiungere il comportamento desiderato è chiamare l' distinctUntilChanged
operatore subito dopo aver chiamatodebounceTime(400)
Vedi l'esempio di implementazione osservabile su Plunker
Per gestire le risposte fuori ordine, consulta l'articolo completo http://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html
Per quanto sto usando Http in angolare, sono d'accordo che nei casi d'uso normali non c'è molta differenza quando si usa Observable over Promise. Nessuno dei vantaggi è davvero rilevante qui in pratica. Spero di vedere qualche caso d'uso avanzato in futuro :)
Per saperne di più
Sia Promises che Observables ci aiuteranno a lavorare con le funzionalità asincrone in JavaScript. Sono molto simili in molti casi, tuttavia ci sono ancora alcune differenze tra i due, le promesse sono valori che si risolveranno in asynchronous
modi come le chiamate http . D'altra parte, gli osservabili hanno a che fare con una sequenza di eventi asincroni . Le principali differenze tra loro sono elencate di seguito:
promettere:
osservabile:
Inoltre, ho creato l'immagine grafica per te di seguito per mostrare visivamente le differenze:
Promise
è il modo sbagliato di pensare alle promesse. È Promise
responsabilità solo gestire il successo o il fallimento in modo asincrono compatibile. Se si desidera annullare una richiesta http, si annulla la richiesta, non la promessa, e si ottiene il risultato dell'annullamento o soddisfare o rifiutare la promessa. jsfiddle.net/greggman/ea0yhd4p
promesse
osservabili
È possibile utilizzare un nuovo operatore per riprovare ogni volta che è necessario, anche se è necessario riprovare l'osservabile in base ad alcune condizioni. Riprovare Quando è possibile utilizzare.
Nota : un elenco di operatori insieme ai loro diagrammi interattivi è disponibile qui su RxMarbles.com
C'è un aspetto negativo di Observables mancante nelle risposte. Le promesse consentono di utilizzare le funzioni asincrono / attendono ES7. Con loro puoi scrivere codice asincrono come se fosse una chiamata di funzione sincrona, quindi non hai più bisogno di callback. L'unica possibilità per gli osservabili di farlo è convertirli in promesse. Ma quando li converti in Promises, puoi avere di nuovo un solo valore di ritorno:
async function getData(){
const data = await observable.first().toPromise();
//do stuff with 'data' (no callback function needed)
}
Ulteriori letture: come posso `attendere` su un Rx osservabile?
Promesse e osservabili entrambi gestiscono solo la chiamata asincrona.
Ecco le differenze tra loro:
Osservabile
Promettere
Emette un solo valore alla volta
Chiama i servizi senza .then e .catch
Non può essere cancellato
Non fornisce alcun operatore
Anche se questa risposta è in ritardo, ho riassunto le differenze di seguito,
Osservabile:
function
che prende an observer
e restituisce un function Observer: an object with next, error.
subscribe/unsubscribe
suo flusso di dati, emette il valore successivo all'osservatore, notify
l'osservatore errors
e informa l'osservatore sulstream completion
function to handle next value
, errori e fine del flusso (eventi dell'interfaccia utente, risposte http, dati con socket Web).multiple values
il tempocancel-able/retry-able
e supporta operatori come map,filter,reduce
ecc.Observable.create()
- restituisce osservabile che può invocare metodi su - Observer Observable.from()
- converte un array o iterabile in - Observable Observable.fromEvent()
- converte un evento in osservabile - Observable.fromPromise()
- converte una promessa in osservabile - Observable.range()
- restituisce una sequenza di numeri interi nell'intervallo specificatoPromessa :
Una promessa rappresenta un compito che finirà in futuro;
Le promesse diventano resolved by a value
;
Le promesse vengono rifiutate da eccezioni;
No cancellable
e ritornaa single value
Una promessa espone una funzione (then)
-quindi restituisce un nuovo promise
;
-consente che il attachment
di quello verrà eseguito in base a
state
;
- handlers
devono guaranteed
essere eseguiti order attached
;
Ho appena affrontato un problema in cui le promesse erano la soluzione migliore e la condivido qui per chiunque si imbatta in questa domanda nel caso in cui sia utile (questa era esattamente la risposta che stavo cercando prima):
In un progetto Angular2 ho un servizio che accetta alcuni parametri e restituisce un elenco di valori per popolare i menu a discesa in un modulo. Quando il componente del modulo viene inizializzato, devo chiamare lo stesso servizio più volte con parametri diversi per definire un numero di menu a discesa diversi, tuttavia se accendo semplicemente tutte le variabili per chiamare il servizio, solo l'ultimo riesce e l'errore di riposo su. Il servizio di recupero dal database poteva gestire solo una richiesta alla volta.
L'unico modo per popolare tutte le variabili del menu a discesa era chiamare il servizio in modo da impedire l'elaborazione di una nuova richiesta fino al termine dell'ultima richiesta e il meccanismo Promise / .then ha risolto il problema in modo corretto.
fetchValueList(listCode): Promise<any> {
return this.dataSvc.getValueList(listCode, this.stateSvc.currentContext, this.stateSvc.currentLanguageCode)
.map(response => response.json())
.toPromise();
}
initializeDropDowns() {
this.fetchValueList('First-Val-List')
.then(data => {
this.firstValList = data;
return this.fetchValueList('Second-Val-List')
}).then(data => {
this.secondValList = data;
return this.fetchValueList('Third-Val-List')
}).then(data => {
this.thirdValList = data;
}) }
Ho definito le funzioni nel componente, quindi ho chiamato initializeDropDowns () in ngOnInit.
La funzione fetchValueList restituisce un Promise, quindi la prima chiamata passa il primo listCode e quando il Promise si risolve, il valore di ritorno è nella variabile data nel blocco .then dove possiamo assegnarlo alla variabile this.firstValList. Poiché la funzione ha restituito dati, sappiamo che il servizio è terminato ed è possibile richiamare in modo sicuro con il secondo listCode, il valore restituito si trova nella variabile di dati nel blocco .then successivo e lo assegniamo alla variabile this.secondValList.
Possiamo concatenarlo tutte le volte che è necessario per popolare tutte le variabili e sull'ultimo blocco di codice semplicemente omettiamo l'istruzione return e il blocco termina.
Questo è un caso d'uso molto specifico in cui abbiamo un singolo servizio che deve essere chiamato più volte durante l'inizializzazione del componente e in cui il servizio deve completare il suo recupero e restituire un valore prima che possa essere richiamato di nuovo, ma in questo caso, il metodo Promise / .then era l'ideale.
scan()
per creare un flusso di osservabili sequenziali. Tuttavia, il tuo approccio è forse più esplicito e più facile da capire.
Credo che tutte le altre risposte dovrebbero chiarire i tuoi dubbi. Tuttavia, volevo solo aggiungere che gli osservabili si basano sulla programmazione funzionale e trovo molto utili le funzioni che ne derivano come mappa, mappa piatta, riduzione, zip. La coerenza che il Web raggiunge soprattutto quando dipende dalle richieste API è un miglioramento brutale.
Consiglio vivamente questa documentazione , poiché è la documentazione ufficiale di reattiveX e trovo che sia la più chiara in circolazione.
Se vuoi entrare in osservabili, suggerirei questo post in 3 parti: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
Sebbene sia pensato per RxJava, i concetti sono gli stessi ed è davvero ben spiegato. Nella documentazione di reattiveX, si hanno le equivalenze per ciascuna funzione. Devi cercare RxJS.
Puoi sempre usare un osservabile per affrontare il comportamento asincrono poiché un osservabile ha tutte le funzionalità offerte da una promessa (+ extra). Tuttavia, a volte questa funzionalità aggiuntiva offerta da Observables non è necessaria. Quindi sarebbe un costo aggiuntivo importare una libreria per usarli.
Usa le promesse quando hai una singola operazione asincrona di cui vuoi elaborare il risultato. Per esempio:
var promise = new Promise((resolve, reject) => {
// do something once, possibly async
// code inside the Promise constructor callback is getting executed synchronously
if (/* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
//after the promise is resolved or rejected we can call .then or .catch method on it
promise.then((val) => console.log(val)) // logs the resolve argument
.catch((val) => console.log(val)); // logs the reject argument
Quindi una promessa esegue del codice in cui si risolve o rifiuta. Se si chiama risoluzione o rifiuto, la promessa passa da uno stato in sospeso a uno stato risolto o rifiutato . Quando lo stato della promessa viene risolto then()
, viene chiamato il metodo. Quando lo stato della promessa viene rifiutato, catch()
viene chiamato il metodo.
Usa gli osservabili quando c'è un flusso (di dati) nel tempo che devi gestire. Un flusso è una sequenza di elementi di dati che vengono resi disponibili nel tempo . Esempi di flussi sono:
Nell'Osservabile si specifica quando si verifica l' evento successivo , quando si verifica un errore o quando l'Osservabile è completato . Quindi possiamo abbonarci a questo osservabile, che lo attiva e in questo abbonamento, possiamo trasmettere 3 callback (non è sempre necessario passare tutto). Un callback da eseguire per esito positivo, un callback per errore e un callback per completamento. Per esempio:
const observable = Rx.Observable.create(observer => {
// create a single value and complete
observer.onNext(1);
observer.onCompleted();
});
source.subscribe(
x => console.log('onNext: %s', x), // success callback
e => console.log('onError: %s', e), // error callback
() => console.log('onCompleted') // completion callback
);
// first we log: onNext: 1
// then we log: onCompleted
Quando si crea un osservabile richiede una funzione di callback che fornisce un osservatore come argomento. Su questo osservatore, è quindi possibile chiamare onNext
, onCompleted
, onError
. Quindi, quando l'Osservabile è abbonato, chiamerà i callback corrispondenti passati nell'abbonamento.
Promessa: fornire un singolo valore futuro. Non pigro . Non annullabile. Rifiuterà o risolverà.
Osservabile: fornisce più valore futuro. Pigro Annullabile. Fornisce altri metodi mappa live, filtro, riduzione.
const promise = new Promise(resolve => {
setTimeout(() => {
resolve("Hello from a Promise!");
}, 2000);
});
promise.then(value => console.log(value));
Esempio osservabile ora. Anche qui passiamo una funzione all'osservabile, un osservatore per gestire l'attività asincrona. A differenza della risoluzione nella promessa, ha il seguente metodo e si abbona al posto di allora.
Quindi entrambi gestiscono le attività asincrone. Ora vediamo la differenza.
const observable = new Observable(observer => {
setTimeout(() => {
observer.next('Hello from a Observable!');
}, 2000);
});
observable.subscribe(value => console.log(value));
Promettere
Osservabile
Sia le promesse che gli osservabili ci aiutano a gestire le operazioni asincrone. Possono richiamare determinati callback quando vengono eseguite queste operazioni asincrone.
Angular usa Observables che proviene da RxJS invece di promesse per gestire HTTP
Below are some important differences in promises & Observables.
Una promessa emette un singolo evento quando un'attività asincrona termina o fallisce.
Un osservabile è come uno stream (in molte lingue) e consente di passare almeno zero o più eventi in cui è richiesto il callback per ogni evento.
Frequentemente osservabile è preferito rispetto a Promessa poiché fornisce i punti salienti di Promessa e altro. Con Observable non importa se devi gestire 0, 1 o vari eventi. È possibile utilizzare l'API simile per ciascun caso.
Promessa: promessa emette un singolo valore
Per esempio:
const numberPromise = new Promise((resolve) => {
resolve(5);
resolve(10);
});
numberPromise.then(value => console.log(value));
// still prints only 5
Osservabile: emette più valori per un periodo di tempo
Per esempio:
const numberObservable = new Observable((observer) => {
observer.next(5);
observer.next(10);
});
numberObservable.subscribe(value => console.log(value));
// prints 5 and 10
possiamo pensare a un osservabile come un flusso che emette più valori per un periodo di tempo e la stessa funzione di callback viene chiamata per ogni elemento emesso, quindi con un osservabile possiamo usare la stessa API per gestire dati asincroni. se tali dati vengono trasmessi come valore singolo o multipli per un certo periodo di tempo.
Promettere:
Osservabile:
Promise emette un singolo valore mentre Observable emette più valori. Quindi, durante la gestione di una richiesta HTTP, Promise può gestire una singola risposta per la stessa richiesta, ma cosa succede se ci sono più risposte alla stessa richiesta, allora dobbiamo usare Osservabile. Sì, Observable può gestire più risposte per la stessa richiesta.
Promettere
const promise = new Promise((data) =>
{ data(1);
data(2);
data(3); })
.then(element => console.log(‘Promise ‘ + element));
Produzione
Promise 1
Osservabile
const observable = new Observable((data) => {
data.next(1);
data.next(2);
data.next(3);
}).subscribe(element => console.log('Observable ' + element));
Produzione
Observable 1
Observable 2
Observable 3
Di seguito sono riportate alcune importanti differenze nelle promesse e osservabili.
Promettere
Osservabile
Per una migliore comprensione, consultare https://stackblitz.com/edit/observable-vs-promises
Vedo molte persone usare l'argomento secondo cui Osservabile è "cancellabile" ma è piuttosto banale rendere Promessa "cancellabile"
function cancellablePromise(body) {
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res; reject = rej;
body(resolve, reject)
})
promise.resolve = resolve;
promise.reject = reject;
return promise
}
// Example 1: Reject a promise prematurely
const p1 = cancellablePromise((resolve, reject) => {
setTimeout(() => resolve('10', 100))
})
p1.then(value => alert(value)).catch(err => console.error(err))
p1.reject(new Error('denied')) // expect an error in the console
// Example: Resolve a promise prematurely
const p2 = cancellablePromise((resolve, reject) => {
setTimeout(() => resolve('blop'), 100)
})
p2.then(value => alert(value)).catch(err => console.error(err))
p2.resolve(200) // expect an alert with 200
Risposta breve :
Osservabile è meglio , ha tutte le funzionalità Promises più funzionalità extra.
Risposta lunga:
promesse:
Osservabile:
Mentre la risposta accettata è buona in generale, non penso che enfatizzi che quando si ha a che fare con componenti angolari si desidera quasi sempre usare un osservabile perché supporta l'annullamento. Le promesse non possono essere annullate e verranno risolte anche se il componente viene distrutto. L'angolare tende a perdonare fino a quando non lo è.
Ad esempio, qualsiasi rilevamento manuale delle modifiche su un componente distrutto causerà un'eccezione:
ngOnInit() {
// promise api
this.service.getData().then(d => {
this.data = d;
this.changeDetectorRef.detectChanges();
});
// observable api
this.service.getData().pipe(takeUntil(this.unsubscribe)).subscribe((d) => {
this.data = d;
this.changeDetectorRef.detectChanges();
});
}
Se il componente viene distrutto prima che la promessa venga risolta, verrà visualizzato un attempt to use destroyed view
errore quando la promessa viene risolta.
In alternativa, se si utilizzano osservabili con il modello takeUntil , non appena il componente viene distrutto, l'abbonamento verrà annullato.
Questo è un esempio un po 'inventato, ma l'esecuzione del codice per un componente che viene distrutto probabilmente porterà a bug. A meno che tu non voglia farlo per qualche motivo: p
Qualcosa in cui mi sono imbattuto che non era evidente da una prima lettura del tutorial e dei documenti era l'idea del multicast.
Assicurati di essere consapevole che, per impostazione predefinita, più abbonamenti attiveranno più esecuzioni in un osservabile. Più abbonamenti a una singola chiamata HTTP Osservabile attiverà più chiamate HTTP identiche a meno che tu .share()
(abiliti il multicast).
Una promessa ti obbliga a gestire una cosa alla volta, a scartare i suoi dati, a gestire le eccezioni, ha il supporto linguistico per cose interessanti come asincrono / attendi ed è piuttosto semplice.
Un osservabile ha molte campane e fischietti, ma devi capire il potere con cui stai lavorando o può essere usato in modo improprio.
Promettere:
Un gestore di eventi asincrono: l'oggetto Promessa rappresenta l'eventuale completamento (o errore) di un'operazione asincrona e il valore risultante.
Sintassi: new Promise (esecutore);
Per esempio:
var promise_eg = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 300);
});
promise_eg.then(function(value) {
console.log(value);
// expected output: "foo"
});
console.log(promise_eg);
Informazioni su Promessa: ha una pipeline, quindi restituirà i valori una sola volta quando viene chiamato. è un gestore a senso unico, quindi una volta chiamato potresti non essere in grado di annullare. sintassi utile su cui giocare, quando () e poi ()
osservabili:
Gli osservabili sono raccolte pigre di più valori nel tempo. è davvero un ottimo approccio per le operazioni asincrone. può essere fatto con rxjs che ha il supporto multipiattaforma può usare con angolare / reagire ecc.
si comporta come stream liner. può essere multi pipeline. quindi, una volta definito, puoi abbonarti per ottenere risultati di ritorno in molti luoghi.
Sintassi: import * as Rx from "@reactivex/rxjs";
per init:
Rx.Observable.fromEvent(button, "click"),
Rx.Subject()
eccetera
sottoscrivere: RxLogger.getInstance();
Per esempio:
import { range } from 'rxjs';
import { map, filter } from 'rxjs/operators';
range(1, 200).pipe(
filter(x => x % 2 === 1),
map(x => x + x)
).subscribe(x => console.log(x));
dal momento che supporta multi pipeline è possibile abbonarsi risultati in posizioni diverse, ha molte possibilità rispetto alle promesse.
Uso:
ha più possibilità comemap, filter, pipe, map, concatMap etc
Gli osservabili sono spesso paragonati alle promesse. Ecco alcune differenze chiave:
Gli osservabili sono dichiarativi; il calcolo non inizia fino alla sottoscrizione. Le promesse si eseguono immediatamente al momento della creazione. Ciò rende osservabili utili per definire ricette che possono essere eseguite ogni volta che è necessario il risultato.
Gli osservabili forniscono molti valori. Le promesse ne forniscono una. Ciò rende osservabili utili per ottenere più valori nel tempo.
Gli osservabili distinguono tra concatenamento e abbonamento. Le promesse hanno solo clausole .then (). Ciò rende osservabili utili per la creazione di complesse ricette di trasformazione che possono essere utilizzate da altre parti del sistema, senza causare l'esecuzione del lavoro.
Osservabili iscriviti () è responsabile della gestione degli errori. Le promesse spingono errori alle promesse dei bambini. Ciò rende osservabili utili per la gestione centralizzata e prevedibile degli errori.
Questa è la differenza più semplice che potresti trovare sui documenti ANGULAR.IO. la risposta di riposo è data dalla maggior parte è corretta al suo posto
Le promesse si concentrano solo per singoli valori o si risolvono, le osservabili sono flussi di dati.
Gli osservabili possono essere cancellati ma le promesse non possono essere cancellate.
Il meno conosciuto, almeno per me è
Osservabili e promesse ci stanno aiutando a lavorare con le funzionalità asincrone in JavaScript / dattiloscritto. Sono molto simili in molti casi, tuttavia ci sono ancora alcune differenze tra loro.
Ci sono già molte risposte su questo argomento, quindi non ne aggiungerei una ridondante.
Ma a qualcuno che ha appena iniziato a studiare Osservabile / Angolare e si chiede quale utilizzare utilizzare rispetto a Promessa , ti consiglierei di mantenere tutto Osservabile e convertire tutte le Promesse esistenti nel tuo progetto in Osservabili.
Semplicemente perché la stessa struttura angolare e la sua comunità utilizzano tutti Osservabile. Quindi sarebbe utile quando si integrano servizi quadro o moduli di terze parti e si concatena tutto insieme.
Mentre apprezzo tutti i downvotes ma insisto ancora sulla mia opinione sopra a meno che qualcuno non abbia inserito un commento appropriato per elencare alcuni scenari che potrebbero essere ancora utili nel tuo progetto angolare per utilizzare Promises over Observables.
Ovviamente, nessuna opinione è corretta al 100% in tutti i casi, ma almeno credo che il 98% delle volte, per i normali progetti commerciali implementati nel quadro angolare, Observable sia la strada giusta da percorrere.
Anche se non ti piace all'inizio del tuo semplice progetto di hobby, realizzerai presto quasi tutti i componenti con cui interagisci in Angular, e la maggior parte del framework di terze parti che utilizza Angular utilizza Observables e quindi ha finito per convertire costantemente la tua promessa in osservabile per comunicare con loro.
Tali componenti includono ma non sono limitati a: HttpClient, Generatore di moduli, Moduli / finestre di dialogo di materiali angolari, Ngrx store / effects e ngx-bootstrap.
In effetti, l'unico ecosistema Promise from Angular che ho affrontato negli ultimi 2 anni è APP_INITIALIZER
.