有几种方法可以实现 1、2、3 和 4。对于第 4 点,我想知道您打算如何使用这些 observables。
一种只使用纯函数而不使用主题的方法是:
var blogPosts$ = Rx.Observable.just(blogPosts);
var index$ = Rx.Observable.merge(nextClicks, prevClicks)
.withLatestFrom(blogPosts$, function(ev, blogPosts){return {posts: blogPosts, ev : ev};})
.scan(function(index, posts_and_ev){
return isNextClick(posts_and_ev.ev) && isNextable(posts_and_ev.posts, index) ? index + 1
:isPrevClick(posts_and_ev.ev) && isPrevable(posts_and_ev.posts, index) ? index - 1
:index
}, 0);
var currentPost$ = index$.withLatestFrom(blogPosts$, function (index, blogPost){return blogPost[index]; }).startWith(blogPosts[0]);
var postNextable = index$.withLatestFrom(blogPosts$, function (index, blogPost){return isNextable(blogPost, index);});
var postPrevable = index$.withLatestFrom(blogPosts$, function (index, blogPost){return isNextable(blogPost, index);})
您寻求的输出在此处命名为currentPost$。
此后包括代码测试。 isNextable、isNextClick、isPrevable、isPrevClick 具有明显的语义,并且易于编写(例如区分键代码或按钮 ID 或其他 next 和 prev 事件)。 sample code