我正在从angular.io学习Angular,我认为我对Observable和Promises掌握得很好(是的,我知道它们不是特定于Angular的)。

但是,在示例中,我发现了一些令我困惑的东西。

所以不要复制/粘贴所有内容;我们有HeroService服务类别

方法之一是:

getHero(id: number | string) {
     return heroesPromise
     .then(heroes => heroes.find(hero => hero.id === +id));
}


那里没有问题,方法使用heroesPromise调用then并返回Promise<Hero>
因此,底线getHero()返回Promise。

第二个组件在名为HeroService的变量中使用此service
这是其他组件中的代码,这使我感到困惑:

ngOnInit() {
    this.route.params
    // (+) converts string 'id' to a number
   .switchMap((params: Params) => this.service.getHero(+params['id']))
   .subscribe((hero: Hero) => this.hero = hero);
}


所以我很困惑的是switchMap()回调中的这一部分:

this.service.getHero(+params['id'])


很明显,这将返回Promise<Hero>,因为这是getHero()返回的结果。

但是,内部Observable的(由switchMap创建)subscribe()方法看起来像这样:

subscribe((hero: Hero) => this.hero = hero)


如您所见,subscribe()的回调采用的是Hero,而不是Promise<Hero>,这是switchMap()的回调返回的内容。

为什么会这样呢?

最佳答案

您必须记住,Promise和Observable是回调的“包装”。当您在Promise链中链接then()或在Observable链中使用运算符时,您正在将函数或值从一个回调传递到下一个回调。

考虑下面的伪代码:

const fn = (something) => { return other(something); }

Observable.from([1, 2, 3])
  .map(o => fn(o))
  .swithMap(o => Promise.resolve(o => fn(o)))
  .swithMap(o => Observable.of(o => fn(o)))


您可以使用switchMap()异步地从某些包装的回调中获取值(从Promise或Observable中获取)。 map()是一个同步运算符,您正在直接处理值。

如果您想了解有关工作原理的更多详细信息,请观看AndréStaltz和You will learn RxJS的精彩演讲。

关于javascript - 有 Angular ,可观察的 promise promise ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43189752/

10-11 23:59
查看更多