1 Execução / Conversão Direta
Use frompara 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 defercom 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 deferespera 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á fromprimeiro 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 ObservableInputou 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 frome deferem 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);
frommétodo retornando observável, mas está enviando promessa como valor para assinaturas. :(