2016-11-24 5 views
2

私はAngular 2のHTTPサービスを使ってデータを取得していますが、APIは 'n'個の結果を返します。RxJS応答の結果を制限し返す最良の方法配列

私はAPIのエンドポイントにアクセスできないことを考慮して(limitまたはfindOneの種類のメソッドを作成するために)、結果の数を処理する最良の方法を試しています。私のHomeServiceの "loadLatest"メソッドを呼び出すコンポーネント。この特定の例では

、応答は次のようになりますオブジェクトです:

{ 
success: true, 
data: [Object, Object, Object], 
user: 'testUser' 
} 

私は(たとえば、それが含まれている唯一の最初の2つのオブジェクトを取得する)データ配列内の唯一の興味があります。

私は単一の結果を取得したい場合は、私はこのような何かを行うことができます:(必ずしもそれは実際に大丈夫だという意味ではありません)

import { Http, Headers } from '@angular/http'; 
import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 

const URL = 'http://exampleapi.com/example'; 

@Injectable() 
export class HomeService { 
constructor(private _http: Http){} 

loadLatest() { 
    return this._http.get(URL) 
    .map(res => res.json()) 
    .map(({data}) => data[0]); 
} 
} 

そして、それは動作しますが...しかし、私は知っているためにそこに持っていますレスポンスオブジェクト内のデータ配列内の最初の2つのオブジェクトを返すより良い方法です。または最初の3つ、または4つ...または多くの場合、私は欲しいです。

私は、私はそれに加入し、私のコンポーネント内のサービスを使用している場所です...しかし、私はそれが実際にこのケースで働くだろうとは思わない、方法を「取る」について

をお読みください。

import { Component, OnInit } from '@angular/core'; 
import { HomeService } from './home.service'; 
import { Observable } from 'rxjs/Observable'; 

@Component({ 
selector: 'home', 
templateUrl: './home.html' 
}) 
export class HomeComponent implements OnInit { 
// I used this typing because I originally only wanted a single item 
// This might have to change 
items: Observable<Object> 

constructor(private homeService: HomeService){} 

ngOnInit() { 
    this.homeService.loadLatest() 
    .subscribe(result => this.items = result); 
} 
} 

あなたが見ることができるように、私は私がの角度* ngForを使用して、これら二つのオブジェクトを反復処理することができるように、結果は、私がthis.itemsに割り当てる二つのオブジェクトを持つ配列であるためにしたいです。

ご協力いただければ幸いです! ありがとうございます!

+0

おそらく私の質問を下落させた人は、なぜ彼/彼女がそうしたのかを詳しく説明したいと思います...私の質問が正しい方法で起こったかどうかはわかりません。私は本当に上記のことを達成するための具体的なリアクティブメソッドがあるのか​​、Puigcerberの答えにコメントしたのかというと、スライスメソッドを使ったマップメソッドが最もパーマネントなアプローチかどうか疑問に思っています。しかし正当な質問の説明がないdownvote ...本当ですか? – deathandtaxes

答えて

4

データ配列にsliceメソッドを使用できます。

loadLatest() { 
    return this._http.get(URL) 
    .map(res => res.json()) 
    .map(({data}) => data.slice(0,2)); 
} 
+0

Arrayの "map"メソッドとRxJSのマップの間にはまだ混乱があります。配列のマップ上では、常に反復処理している配列に含まれる項目のそれぞれに移動します。反復処理から抜け出せません。私はこれが私に混乱していると思います。私はこの場合、単にマップメソッドの内部でスライスを使用することができ、それは一度 "入る"だけで操作を実行することができますか?私が言うことは、4または5または6 ...時間( "{データ}"配列内のアイテムの長さ)には入らず、同じスライスアクションを繰り返し実行するということですか?確かに私は自分自身を明確にしているかどうかはわかりません... – deathandtaxes

+0

私はもともとこのアプローチについて考えていましたが、これが実行可能かどうかはわかりません。 ObservablesとRxJSの仕組みを正確に理解していないので、実際には "軽い"ものであるかどうか、またはこれを達成するための具体的な方法やパターンがあるかどうかは不明です。また、実際にそう言っているわけではない、私は真に疑問に思います。 – deathandtaxes

+0

これらは、誰かが観測対象を購読するたびに1回だけ呼び出されます。最初の 'map'は' response'オブジェクトを取得し、それを第2の 'map'が取得するJSONオブジェクトに変換しますが、データ配列を取得するためにオブジェクトの構造化を使用するようにdataプロパティだけを必要とします。あなたが必要とする部分だけを返します。 – Puigcerber

関連する問題