在官方angular2 tutorial中,它包含以下代码
getHeroes(): Promise<Hero[]> {
return Promise.resolve(HEROES);
}
ngOnInit(): void {
this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id']))
.subscribe(hero => this.hero = hero);
console.log(this.route.params);
console.log(this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id'])));
}
现在我们知道this.route.params
返回一个observable,而
this.heroService.getHero(+params['id'])
返回承诺
以下是rxjs
switchmap
switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable
我们看到第一个参数采用了一个发出可观察的函数。
然而,在上面的例子中,我们实际上传递了一个发出promise的函数。
它们是否相互兼容?
此外还有控制台
console.log(this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id'])));
输出
AnonymousSubject {_isScalar: false, observers: Array[0], closed: false, isStopped: false, hasError: false…}
不应该将_isScalar
设置为true,因为函数会输出一个承诺吗?
答案 0 :(得分:5)
在许多地方,RxJS API接受ObservableInput
:
export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T>;
可以是可观察的,承诺或类似数组的可迭代对象。
在您的问题中包含的代码中,传递给switchMap
的project
函数会返回一个承诺。没关系,因为switchMap
接受返回project
的{{1}}个函数:
ObservableInput
export function switchMap<T, R>(
this: Observable<T>,
project: (value: T, index: number) => ObservableInput<R>
): Observable<R>;
实现将看到promise被转换为observable。
关于结果observable的内部 switchMap
属性,当promise解析并且解析后的值存储在observable中时,它将被设置为_isScalar
。我的理解是,在RxJS中,标量不会引用将要发出的值的数量,而是指所述值是否可用于立即发射。