RxJS运行Promise,然后组合最新

时间:2017-11-05 21:27:25

标签: javascript typescript promise rxjs

我最近为许多可观察的问题道歉,但我仍然非常难以掌握如何将所有内容联系在一起。

我有一个用户,他使用基于承诺的存储来存储他们不想看到的供稿名称。在Social Feeds小部件上,他们可以看到每个Feed中没有过滤掉的最新文章。

我想在硬编码的Feed列表和他们想要隐藏的Feed上加入联合。要使用我已经提供的API,我需要多次调用该服务以单独检索每个Feed。

在我建立联盟之后,我希望按顺序组合实用程序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$);
}

修改:再次,对不起之前的稀疏代码感到抱歉。

1 个答案:

答案 0 :(得分:0)

你的例子唯一的问题是你在错误的时间范围内进行操作。 combineLatest需要一个Observable数组,而不是Observable数组的Future,需要在promise处理程序中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[]> } 。总而言之:

mergeMap

P.S。 extend的投影函数意味着您可以在合并的同一步骤中将值映射到Observables,而不是映射它们并单独合并它们。