1 직접 실행 / 변환
from
이전에 생성 된 약속을 관찰 가능 항목으로 직접 변환하는 데 사용 합니다.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
구독자에게 약속 가치를 효과적으로 재생 하는 뜨거운 관측 가능 합니다.
Observable이 작성 될 때 약속 본문이 실행 중이거나 이미 해결되었습니다. 내부 약속이 해결 된 경우 옵저버 블에 대한 신규 가입자는 즉시 가치를 얻습니다.
모든 구독에 대해 2 개의 지연된 실행
defer
약속의 팩토리 기능을 입력으로 사용 하여 약속의 생성 및 관찰을 관찰 가능으로 지연시킵니다.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
차가운 관측 가능할 것입니다 .
차이점 from
은 defer
가입자 를 기다렸다가 주어진 약속 팩토리 함수를 호출하여 새 약속을 작성한다는 것입니다. 이것은 Observable을 만들고 싶지만 내면의 약속을 즉시 실행하고 싶지 않을 때 유용합니다. 내면의 약속은 누군가가 옵저버 블에 가입 한 경우에만 실행됩니다. 각 가입자는 또한 자신의 새로운 관찰 대상을 얻게됩니다.
3 많은 운영자가 직접 약속을 받아들입니다
결합 대부분의 RxJS 사업자 (예를 들어 merge
, concat
, forkJoin
, combineLatest
...) 또는 (예를 들어, 관찰 가능한 변환 switchMap
, mergeMap
, concatMap
, catchError
...) 직접 약속을 받아들입니다. 어쨌든 그중 하나를 사용 from
하는 경우 약속을 먼저 포장하는 데 사용할 필요는 없습니다 (그러나 차가운 관찰 가능 을 만들려면 여전히을 사용해야 할 수도 있습니다 defer
).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
사용중인 연산자가 또는 을 수락하는지 확인하려면 설명서 또는 구현 을 확인하십시오 .ObservableInput
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>;
예 from
와 defer
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
메소드는 관찰 가능을 반환하지만 구독에 가치로 약속을 보내고 있습니다. :(