web-dev-qa-db-ja.com

なぜRxJs of()関数を使用する必要があるのですか?

angular2のangular.ioチュートリアルのサービスセクションで、of.forという名前のメソッドにヒットしました:

getHeroes(): Observable<Hero[]> {
  return of(HEROES);
}

または以下のサンプル:

getHero(id: number): Observable<Hero> {
  // Todo: send the message _after_ fetching the hero
  this.messageService.add(`HeroService: fetched hero id=${id}`);
  return of(HEROES.find(hero => hero.id === id));
}

角度で.io

rxJS of()を使用して、Observableの模擬ヒーロー(Observable)を返しました。

そして、なぜ関数を使うべきなのか、それが何をするのか、そして何がその利点なのかを説明していませんでしたか?

20
Aref Zamani

彼らがof()を使用している理由は、実際のHTTP呼び出しの代わりに非常に使いやすいからです。

実際のアプリケーションでは、たとえば次のようにgetHeroes()を実装します。

_getHeroes(): Observable<Hero[]> {
  return this.http.get(`/heroes`);
}
_

しかし、実際のバックエンドを作成せずに模擬応答を使用したいだけなので、of()を使用して偽の応答を返すことができます。

_const HEROES = [{...}, {...}];

getHeroes(): Observable<Hero[]> {
  return of(HEROES);
}
_

of()はObservableであり、後でthis.http.get(...)を使用しているかのように演算子をサブスクライブまたはチェーンできるため、アプリケーションの残りの部分は同じように機能します。

of()が行う唯一のことは、サブスクリプションですぐにパラメーターを単一のエミッションとして送信し、complete通知を送信することです。

34
martin

Observable.of()は、非同期相互作用(APIへのhttp要求など)を実装する前にObservableデータ型を維持するのに役立ちます。

Brandon Miller が示唆するように、Observable.of()はObservableを返し、Observableはパラメーターとしてof()に提供された値を即座に出力し、完了します。

これは、非同期プロセスを実装する前でも、Observable型(同期および非同期の両方で動作する)を処理できるサブスクライバーを作成できるため、静的な値を返すよりも優れています。

//this function works synchronously AND asynchronously
getHeroes(): Observable<Hero[]> { 
  return Observable.of(HEROES)
  //-OR-
  return this.http.get('my.api.com/heroes')
  .map(res => res.json());
}

//it can be subscribed to in both cases
getHeroes().subscribe(heroes => {
  console.log(heroes); // '[hero1,hero2,hero3...]'
}

//DON'T DO THIS
getHeroesBad(): Array<Hero> {
  return HEROES                             //Works synchronously
  //-OR-
  return this.http.get('my.api.com/heroes') //TypeError, requires refactor
}
6
zhark

最初の例では、HEROES変数はオブジェクトの配列であり、すべてのオブジェクトがインターフェイスHero(またはクラスHeroのインスタンス)に対応すると仮定します。この関数をコード内のどこかで呼び出すと、次のように動作します。

_heroService.getHeroes()
  .subscribe((heroes: Hero[]) => {
    console.log(heroes) 
    // will output array of heroes: [{...}, {...}, ...]
  })
_

つまり、Observableof作成メソッドを引数として配列とともに使用すると、サブスクリプション時に、要素ごとではなく配列全体が発行されます。

2番目の例では、getHero()メソッドから返されたObservableをサブスクライブすると、特定のIDに対応するIDを持つヒーローが1人だけ放出されます。

基本的に、Observableメソッドでofメソッドを作成し、引数を指定すると、サブスクリプションでこれらの引数が1つずつ出力されます

これは良いリファレンスです

0
vanelizarov