2017-12-14 7 views
0

관찰 가능한 개체 컬렉션을 반환하는 API 호출이 있습니다. 관찰 가능한 컬렉션의 각 개체에 대해 관찰 가능한 값을 얻기 위해 다른 API 호출을해야합니다.관찰 가능 컬렉션을 병합하여 관찰 가능 컬렉션 병합

관찰 가능한 컬렉션을 관찰 가능한 컬렉션과 병합하는 올바른 방법은 무엇입니까? 그러면 결과가 추가 데이터를 제거 할 수있는 관찰 가능한 컬렉션입니까?

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. 티커 각각 관찰
  4. 다시 lastTrade의 관찰 가능한 각각의 (최후의) 방사 이벤트를 포함하는 배열을 방출 관찰을 만들 수는 forkJoin 방법을 사용하는지도 조작자
  5. 를 사용 lastTrade, 하나의 관찰로 변환
+0

감사합니다. – bny

+0

'forkJoin' 메소드의 문법을 제 머리로 감싸고 싶습니다. 앞부분에'observables '라는 사실을 알리는'... '이 있습니까? - 어쨌든 나는 이제'HTTP 429 : too many requests'의 줄에 다른 문제가 있습니다. 서버를 범람하지 않도록이 작업을 제어하는 ​​방법에 대한 통찰력이 있습니까? 'getTicker' 요청? 감사합니다 – bny

+0

첫 번째 질문 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator –