angular - observable 和 promise 在 rxjs 中兼容吗?

标签 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']) 返回一个 promise

这是 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,因为该函数输出一个 promise?

最佳答案

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

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

它可以是可观察对象、promise 或类似数组的可迭代对象。

在问题中包含的代码中,project 函数传递给了 switchMap返回一个 promise 。这很好,因为 switchMap 接受返回 ObservableInputproject 函数:

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

switchMap 实现将看到 promise 被转换为 observable。

关于结果可观察对象的 internal _isScalar 属性,当 promise 解析并且解析的值存储在可观察的。我的理解是,在 RxJS 中,标量 不是指将发出的值的数量,而是指所述值是否可用于立即发出。

关于angular - observable 和 promise 在 rxjs 中兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41916444/

相关文章:

Angular2 如何指向延迟加载的模块?

javascript - *ngIf 上使用的 Angular 4 构造函数值

javascript - 如何将参数传递给 usePromise React hook 内的 Promise

javascript - 如何触发 rxjs observable

javascript - read.ts(6133)模块 '"../../../node_modules/rxjs/observable/combineLatest "' has no exported member 'combineLatest'.ts(2305)

angular - 在垫选择上过滤

javascript - 如何知道是否有溢出隐藏的子div : hidden in Angular6

Angular :node_modules/@angular/material/index.d.ts' 不是模块

javascript - 从 RxJS promise 流

javascript - thenable 链是异步的 - Promises 吗?