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

Kev*_*vin 4 promise observable rxjs angular

在官方的angular2教程中,它包含以下代码

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'])));
}
Run Code Online (Sandbox Code Playgroud)

现在我们知道this.route.params返回一个observable,同时 this.heroService.getHero(+params['id'])返回一个promise

这是签名 rxjs switchmap

switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable
Run Code Online (Sandbox Code Playgroud)

我们看到第一个参数采用发出可观察的函数.

但是在上面的例子中,我们实际上传递了一个发出promise的函数.

它们是否相互兼容?

此外还有控制台

console.log(this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id'])));
Run Code Online (Sandbox Code Playgroud)

输出

AnonymousSubject {_isScalar: false, observers: Array[0], closed: false, isStopped: false, hasError: false…}
Run Code Online (Sandbox Code Playgroud)

不应该_isScalar设置为true,因为函数输出一个承诺?

car*_*ant 5

在许多地方,RxJS API接受ObservableInput:

export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T>;
Run Code Online (Sandbox Code Playgroud)

这可以是一个可观察的,一个promise或一个类似数组的可迭代对象.

在您的问题中包含的代码中,project传递的函数switchMap返回一个promise.没关系,因为switchMap接受project返回的函数ObservableInput:

export function switchMap<T, R>(
  this: Observable<T>,
  project: (value: T, index: number) => ObservableInput<R>
): Observable<R>;
Run Code Online (Sandbox Code Playgroud)

switchMap实施将看到的承诺转化为可观察到的.

关于结果observable的内部 _isScalar属性,它将被设置为truepromise解析并且已解析的值存储在observable中.我的理解是,在RxJS中,标量不是指将要发射的值的数量,而是指所述值是否可用于立即发射.