1直接実行/変換
from
以前に作成されたプロミスをオブザーバブルに直接変換するために使用します。
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
加入者への約束の値を効果的に再生するホットなオブザーバブルになります。
promised bodyは実行中か、オブザーバブルが作成されたときにすでに解決されています。内部の約束が解決された場合、オブザーバブルの新しいサブスクライバーはすぐにその値を取得します。
2サブスクライブごとの遅延実行
defer
promiseファクトリ関数を入力として使用して、promiseの作成とオブザーバブルへの変換を延期します。
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
なります寒い観察できます。
との違いfrom
はdefer
、サブスクライバーを待機してから、指定されたpromiseファクトリー関数を呼び出して新しいpromiseを作成することです。これは、オブザーバブルを作成したいが、内部のプロミスをすぐに実行したくない場合に役立ちます。インナープロミスは、誰かがオブザーバブルをサブスクライブしたときにのみ実行されます。各サブスクライバーは、独自の新しいオブザーバブルも取得します。
3多くのオペレーターが約束を直接受け入れる
コンバインほとんどRxJS事業者(例えばmerge
、concat
、forkJoin
、combineLatest
...)、または(例えば観測変換switchMap
、mergeMap
、concatMap
、catchError
...)直接約束を受け入れます。とにかくそれらのいずれかを使用from
している場合は、最初にpromiseをラップするために使用する必要はありません(ただし、コールドオブザーバブルを作成するために、まだ使用する必要がある場合があります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
メソッドは監視可能を返しますが、サブスクリプションに値としてpromiseを送信しています。:(