1 Esecuzione / conversione diretta
Utilizzare fromper convertire direttamente una promessa precedentemente creata in osservabile.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$sarà un osservabile a caldo che ripropone efficacemente il valore delle promesse agli abbonati.
Il corpo delle promesse viene eseguito o è già stato risolto quando viene creato l'osservabile. Se la promessa interiore è stata risolta, un nuovo abbonato all'osservabile otterrà immediatamente il suo valore.
2 Esecuzione differita su ogni iscrizione
Utilizzare defercon una funzione promessa di fabbrica come input per differire la creazione e la conversione di una promessa in osservabile.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$sarà un freddo osservabile .
La differenza fromè che deferaspetta un abbonato e solo allora crea una nuova promessa chiamando la funzione di fabbrica promessa data. Questo è utile quando vuoi creare un osservabile ma non vuoi che la promessa interiore venga eseguita immediatamente. La promessa interiore sarà eseguita solo quando qualcuno si iscriverà all'osservabile. Ogni abbonato riceverà anche il proprio nuovo osservabile.
3 Molti operatori accettano direttamente le promesse
La maggior parte degli operatori che combinano RxJS (ad esempio merge, concat, forkJoin, combineLatest...) o trasformare osservabili (ad esempio switchMap, mergeMap, concatMap, catchError...) accettano direttamente promesse. Se stai usando uno di essi comunque non devi usare fromper concludere una promessa (ma per creare un osservabile a freddo potresti ancora usare defer).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Controlla la documentazione o l' implementazione per vedere se l'operatore che stai utilizzando accetta ObservableInputo SubscribableOrPromise.
type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
// Note the PromiseLike ----------------------------------------------------v
type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;
La differenza tra frome deferin un esempio: https://stackblitz.com/edit/rxjs-6rb7vf
const getPromise = val => new Promise(resolve => {
console.log('Promise created for', val);
setTimeout(() => resolve(`Promise Resolved: ${val}`), 5000);
});
// the execution of getPromise('FROM') starts here, when you create the promise inside from
const fromPromise$ = from(getPromise('FROM'));
const deferPromise$ = defer(() => getPromise('DEFER'));
fromPromise$.subscribe(console.log);
// the execution of getPromise('DEFER') starts here, when you subscribe to deferPromise$
deferPromise$.subscribe(console.log);
frommetodo restituisce osservabile ma sta inviando promessa come valore agli abbonamenti. :(