2017-11-05 1 views
0

최근에 많은 관찰 가능한 질문에 사과드립니다. 그러나 모든 것을 함께 묶는 방법을 파악하는 데는 여전히 어려움을 겪고 있습니다.RxJS Promise를 실행 한 다음 combineLatest

나는 약속 기반 저장소를 사용하여보고 싶지 않은 피드의 이름을 저장하고있는 사용자가 있습니다. 소셜 피드 위젯에서 그들은 필터링하지 않은 각 피드의 최신 기사를 보게됩니다.

하드 코딩 된 피드 목록과 숨기려는 피드에 대한 통합을 원합니다. 필자가 제공 한 API로 작업하려면 각 피드를 개별적으로 검색하기 위해 서비스를 여러 번 호출해야합니다.

내가 노조를 만든 후에는 유틸리티 getFeed 메서드가 생성하는 관찰 결과를 순차적으로 결합하려고합니다.

다음은 일부 pseduocode와 관련이 있습니다.

/** 
* This gets the top items from all available social media sources. 
* @param limit {number} The number of items to get per source. 
* @returns {Observable<SocialItem[]} Returns a stream of SocialItem arrays. 
*/ 
public getTopStories(limit: number = 1): Observable<SocialItem[]> { 

    // Merge the list of available feeds with the ones the user wants to hide. 
    const feedsToGet = this.storage.get('hiddenFeeds') 
     .then(hiddenFeeds => _.union(FeedList, hiddenFeeds)); 

    // Let's use our function that retrieves the feeds and maps them into an Observable<SocialItem[]>. 
    // We need to splice the list because only 'limit' amount of articles can come back from each feed, and the API cannot accommodate sending anything else than 25 items at a time. 
    // We need to do mergeMap in order to return a single array of SocialItem, instead of a 2D array. 
    const feeds$ = feedsToGet.map(feed => this.getFeed(feed).map(res = res ? res.slice(0, limit) : []).mergeMap(val => val)); 

    // Let's combine them and return 
    return Observable.combineLatest(feed$); 
} 

편집 : 다시 전에 스파 스 코드에 대한 죄송합니다.

+0

'Observable.fromPromise ...'앞에 오는 것이 작동하지 않는 것처럼 보입니다. 병합 매핑 배열을 사용 하시겠습니까? 보다 광범위하게, 나는 추측 할 위험이있다 :'Promise >>'의 결과에'combineLatest'를 시도하고 있습니까? – concat

+0

나는 왜 mergeMap을 사용하는지 모르겠습니다. 모든 배열을 하나의 단일 배열로 평면화하는 유일한 방법이었습니다. – EHorodyski

+0

실수로, 'mergeMap' [자동적으로 Iterables을 Observables로 강제 변환] (https://github.com/Reactive-Extensions/RxJS/issues/319)를 보았습니다. 오늘 새로운 것을 배웠습니다! – concat

답변

0

예를 들어 문제는 잘못된 시간대에 조작을 수행한다는 것입니다. combineLatest에는 Observable 배열이 필요하며 Observable 배열의 미래에는 약속 핸들러에서 combineLatest이 필요하다는 힌트가 필요합니다. 나머지 절반은 Promise<Observable<SocialItem[]>>Observable<SocialItem[]>으로 강제 변경하기위한 마지막 단계입니다.이 부분은 mergeMap입니다. 모두 모두 :

public getTopStories(limit: number = 1): Observable<SocialItem[]> { 
    // Merge the list of available feeds with the ones the user wants to hide. 
    const feeds_future = this.storage.get('hiddenFeeds') 
     .then(hiddenFeeds => Observable.combineLatest(_.map(
      _.union(FeedList, hiddenFeeds), 
      feed => this.getFeed(feed).mergeMap(res => res ? res.slice(0, limit) : []) 
     ))); // Promise<Observable<SocialItem[]>> 

    return Observable.fromPromise(feeds) // Observable<Observable<SocialItem[]>> 
        .mergeMap(v => v); // finally, Observable<SocialItem[]> 
} 

P.S. mergeMap의 투영 함수를 사용하면 값을 매핑하고 별도로 병합하는 대신 병합 된 것과 동일한 단계에서 Observables에 값을 매핑 할 수 있습니다.