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