1 Execução / Conversão Direta
Use from
para converter diretamente uma promessa criada anteriormente em um observável.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
será um observável quente que efetivamente repete o valor prometido aos assinantes.
O organismo de promessas está sendo executado ou já foi resolvido quando o observável é criado. Se a promessa interna tiver sido resolvida, um novo assinante do observável receberá seu valor imediatamente.
2 Execução Adiada em Cada Assinatura
Use defer
com uma função de fábrica de promessas como entrada para adiar a criação e conversão de uma promessa em um observável.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
será um observável frio .
A diferença from
é que defer
espera por um assinante e só então cria uma nova promessa chamando a função de fábrica de promessa fornecida. Isso é útil quando você deseja criar um observável, mas não deseja que a promessa interna seja executada imediatamente. A promessa interior só será executada quando alguém se inscrever no observável. Cada assinante também terá seu próprio novo observável.
3 Muitos operadores aceitam promessas diretamente
A maioria dos operadores RxJS que combinam (por exemplo merge
, concat
, forkJoin
, combineLatest
...) ou transformar observáveis (por exemplo switchMap
, mergeMap
, concatMap
, catchError
...) aceitar promessas diretamente. Se você estiver usando um deles de qualquer maneira, não precisará from
primeiro cumprir uma promessa (mas para criar um observável frio, você ainda precisará usar defer
).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Verifique a documentação ou implementação para ver se o operador que você está usando aceita 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>;
A diferença entre from
e defer
em um exemplo: 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étodo retornando observável, mas está enviando promessa como valor para assinaturas. :(