【发布时间】:2016-02-12 16:49:15
【问题描述】:
我的应用程序中有 2 个服务。一个通过网络加载 YouTube 评论线程和 cmets 的 YouTube 服务,以及一个管理批量加载 cmets 的评论服务。 cmets 服务特定于我的应用程序,youtube 服务与应用程序无关。
我有一个函数getCommentThreadsForChannel 可以加载评论线程。主要的实现是在 youTube 服务中,但这是在评论服务上调用的,它基本上只是调用返回来自 youTube 服务的 observable。
就我调用它的控制器而言,这只是一个可观察的评论线程序列。但是,在我的 commentService 中,我想将这些线程存储在本地。每当我获得 100 个以上的线程时,我想将其批量存储到所有线程中,这样我就不会处理每个新数据位的列表。我想出了这个代码:
getCommentThreadsForChannel(): Rx.Observable<ICommentThread> {
var threadStream: Rx.Observable<ICommentThread> =
this.youTubeService.getCommentThreadsForChannel();
threadStream
.bufferWithCount(100)
.scan( ( allItems, currentItem ) => {
currentItem.forEach(thread => {
allItems.push(thread);
});
console.log( `Save items to local storage: ${allItems.length}` )
return allItems;
}, [] );
return threadStream;
}
我认为这里用于批处理线程并将所有线程累积到一个数组中的逻辑很好,但从未调用此代码。我想这是因为我根本没有订阅这个帖子。
我不想在这里订阅,因为这将订阅底层流,然后我将有 2 个订阅,所有数据将加载两次(有很多数据 - 加载所有数据大约需要一分钟一次超过 30 次调用 100 个线程)。
这里我基本上想要一个do,它不会影响传递给控制器的流,但我想使用RXjs的缓冲和累积逻辑。
我认为我需要以某种方式共享或发布流,但我之前使用这些运算符收效甚微,而且不知道如何在不添加第二个订阅的情况下做到这一点。
如何在不订阅两次的情况下共享一个流并以两种不同的方式使用它?我可以创建某种仅在基于订阅的可观察对象时订阅的被动流吗?
【问题讨论】:
标签: javascript typescript rxjs