Angular,observable订阅承诺

时间:2017-04-03 16:29:00

标签: javascript angular promise observable

我正在从postCode学习Angular,我认为我对Observables和Promises有很好的把握(是的,我知道它们不是Angular特有的)。

然而,在示例中,我发现了让我困惑的事情。

所以不要复制/粘贴所有内容;我们有angular.io服务类

其中一种方法是:

HeroService

没有问题,方法使用getHero(id: number | string) { return heroesPromise .then(heroes => heroes.find(hero => hero.id === +id)); } 调用heroesPromise,返回then 所以底线Promise<Hero>返回Promise。

第二个组件在名为getHero()的变量中使用此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>返回的内容。

但是内部Observable(由getHero()switchMap方法创建的内容如下所示:

subscribe()

正如您所看到的,subscribe((hero: Hero) => this.hero = hero) 的回调需要subscribe(),而不是Hero回调Promise<Hero>

为什么这样,有什么想法?

1 个答案:

答案 0 :(得分:1)

你必须记住,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的精彩演讲。