繁体   English   中英

有角度,可观察的承诺承诺

[英]Angular, observable subscribing to promise

我正在从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。

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

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创建)的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的精彩演讲, 您将学习RxJS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM