我最近为许多可观察的问题道歉,但我仍然非常难以掌握如何将所有内容联系在一起。
我有一个用户,他使用基于承诺的存储来存储他们不想看到的供稿名称。在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$);
}
修改:再次,对不起之前的稀疏代码感到抱歉。
答案 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,而不是映射它们并单独合并它们。