簡體   English   中英

有角度,可觀察的承諾承諾

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM