是否可观察并承诺在rxjs中兼容?

时间:2017-01-29 00:36:11

标签: angular promise rxjs observable

在官方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,因为函数会输出一个承诺吗?

1 个答案:

答案 0 :(得分:5)

在许多地方,RxJS API接受ObservableInput

export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T>;

可以是可观察的,承诺或类似数组的可迭代对象。

在您的问题中包含的代码中,传递给switchMapproject函数会返回一个承诺。没关系,因为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中,标量不会引用将要发出的值的数量,而是指所述值是否可用于立即发射。