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