1直接执行/转换
用于from
将先前创建的承诺直接转换为可观察的。
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
将是一个热点观察,可以有效地重现对订户的承诺值。
创建observable时,promise主体正在执行或已经解析。如果内部承诺已解决,则可观察对象的新订户将立即获得其价值。
2每个订阅上的递延执行
使用defer
与承诺工厂函数作为输入推迟的承诺可观察到的创建和转换。
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
必先包装诺言(但是要创建冷的可观察性,您可能仍必须使用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
方法返回observable,但是它将promise作为值发送给订阅。:(