2017-12-14 6 views
0

オブジェクトの観測可能なコレクションを返すAPI呼び出しがあります。その観測可能なコレクション内の各オブジェクトについて、私は観測可能な値を得るために別のAPI呼び出しを行う必要があります。observableコレクションとobservablesコレクションのマージ

観測可能なコレクションを観測可能なオブジェクトのコレクションとマージする正しい方法は何ですか?その結果は、余分なデータを取り除く観測可能なコレクションですか?

IE:(1:N) - 具体的には> 1

// getMarkets API response: 
[ { 
    "data": [ 
     { 
     "mkt_name": "X", 
     ... 
     }, 
     {...}, {...}, {...} 
     //there is a lot of these, cardinality changes over time 
    ]} 
] 
//getTicker(market=X) API response: 
[ { 
    "data": [ 
     { 
     "last_trade": "651.4000000000", 
     ... 
     } 
     //there is only one of this, "last_trade" value changes a lot more over time 
    ], 
    "notifications": [] 
    } 
] 

と私は私が使用してgetMarketWithTickersを実装するにはどうすればよい

//getMarketsWithTickers Service response (! Also Observable !) 
[ 
    {"market" : "X", "last_trade" : "651.4000000000" }, 
    {...}, 
    {...}, 
    {...} 
] 

が必要getMarkets/getTickerオブザーバブル?

注:私はこのRxJS全体について初めてです。

ありがとうございます。

答えて

3

あなたができることを示す完全な実行可能な例です。

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/of'; 
import 'rxjs/add/operator/switchMap'; 
import 'rxjs/add/observable/forkJoin'; 
import 'rxjs/add/operator/map'; 

// what you already have (simulated): 
interface Market { 
    name: string; 
} 

interface Trade { 
    lastTrade: string; 
} 

function getMarkets() { 
    return Observable.of({data: [{name: 'm1'}, {name: 'm2'}, {name: 'm3'}] as Array<Market>}) 
} 

function getTicker(marketName: string) { 
    return Observable.of({data: {lastTrade: marketName.substring(1)}}); 
} 

// what you can do: 
getMarkets() 
    .map(obj => obj.data.map(market => market.name)) //1 
    .switchMap(marketNames => 
    Observable.forkJoin(// 4 
     ...marketNames.map(market => getTicker(market) // 2 
     .map(ticker => +ticker.data.lastTrade))) // 3 
) 
    .subscribe(trades => console.log(trades.join(', '))); 

短い説明(詳細は、ドキュメントを読んで):

  1. あなたは、配列を受信すると、マップのオペレータ
  2. を使用して、市場の名前の観測可能に市場のコレクションのあなたの観察可能な変換市場名のうち、それぞれについて、ティッカーの観察可能なものを作成します。
  3. ティッカーの各観察は、ユーザーがlastTradeの観測のそれぞれの(最後の)放出されたイベントを含む観察可能な発光素子アレイを作成するforkJoinメソッドを使用マップオペレータ
  4. を用いて再度lastTrade、一方の観察に変換されます
+0

okありがとうございます。 – bny

+0

私は 'forkJoin'メソッドの構文を頭に入れようとしています。実際にはオブザーバブルの集合であることを伝えるための' ... 'は先頭にありますか? - とにかく私は今、 'HTTP 429:too many requests'の行に沿って他の問題があります。あなたはこの事を抑制する方法についての洞察力を持っていますので、サーバをあふれさせませんか? 'getTicker'リクエスト?ありがとう – bny

+0

最初の質問:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator –

関連する問題