我正在从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>
。
为什么这样,有什么想法?
答案 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的精彩演讲。