[英]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.