【问题标题】:Is observable and promise compatible in rxjs?rxjs 中的 observable 和 promise 兼容吗?
【发布时间】:2017-06-14 11:04:32
【问题描述】:

在官方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']) 返回一个承诺

这是rxjsswitchmap的签名

switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable

我们看到第一个参数接受一个函数,该函数发出一个 observable。

但是在上面的示例中,我们实际上传入了一个发出承诺的函数。

它们彼此兼容吗?

还有控制台

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?

【问题讨论】:

  • 您可能正在寻找Observable#fromPromise (v4 docs, v5 docs)
  • @Whymarrh 所以fromPromise 在我上面提供的示例中隐式调用?

标签: angular promise rxjs observable


【解决方案1】:

在许多地方,RxJS API 接受ObservableInput

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

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

在您包含在问题中的代码中,传递给 switchMapproject 函数返回一个承诺。没关系,因为switchMap 接受返回ObservableInputproject 函数:

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

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

关于结果 observable 的 internal _isScalar 属性,当 Promise 解析并且解析的值存储在 observable 中时,它将设置为 true。我的理解是,在 RxJS 中,scalar 并不是指将要发出的值的数量,而是指所述值是否可用于立即发出。

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 2017-05-04
    • 2018-02-05
    • 2017-02-07
    • 1970-01-01
    • 2016-12-25
    • 2018-02-19
    • 2016-12-11
    • 2017-11-25
    相关资源
    最近更新 更多