1 Exécution / conversion directe
Permet from
de convertir directement une promesse précédemment créée en une observable.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
sera un observable à chaud qui relit efficacement la valeur des promesses pour les abonnés.
Le corps des promesses est en cours d'exécution ou a déjà été résolu lors de la création de l'observable. Si la promesse intérieure a été résolue, un nouvel abonné à l'observable obtiendra immédiatement sa valeur.
2 Exécution différée sur chaque abonnement
Utiliser defer
avec une fonction d'usine de promesse comme entrée pour différer la création et la conversion d'une promesse en observable.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
sera un froid observable .
La différence avec from
est defer
qu'attend un abonné et crée ensuite une nouvelle promesse en appelant la fonction d'usine de promesse donnée. Ceci est utile lorsque vous souhaitez créer un observable mais que vous ne voulez pas que la promesse intérieure soit exécutée immédiatement. La promesse intérieure ne sera exécutée que lorsque quelqu'un souscrira à l'observable. Chaque abonné recevra également son propre nouvel observable.
3 De nombreux opérateurs acceptent directement les promesses
La plupart des opérateurs de RxJS qui combinent (par exemple merge
, concat
, forkJoin
, combineLatest
...) ou transformer observables (par exemple switchMap
, mergeMap
, concatMap
, catchError
...) accepter des promesses directement. Si vous utilisez l'un d'eux de toute façon, vous n'avez pas à utiliser from
pour envelopper une promesse en premier (mais pour créer un observable froid, vous devrez peut-être encore utiliser defer
).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Vérifiez la documentation ou l' implémentation pour voir si l'opérateur que vous utilisez accepte ObservableInput
ou 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 différence entre from
et defer
dans un exemple: 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);
from
méthode retourne observable mais envoie une promesse comme valeur aux abonnements. :(