請記住,在rxjs一切都是甲流,你可以使用你的優勢,我已經修改了你搗鼓一下,讓一切現在是一個流:
var pageClicks = Rx.Observable.fromEvent(document.getElementById('page'), 'click');
var highlightClicks = Rx.Observable.fromEvent(document.getElementById('highlight'), 'click');
var bothClicks = Rx.Observable.fromEvent(document.getElementById('both'), 'click');
var page = 0;
var nextPage$ = Rx.Observable.of(page)
.map(function() {
page = (page + 1) % 2;
return page
})
.switchMap(loadData)
.do(renderData);
var doBoth$ = nextPage$
.do(highlight);
// initial rendering of data
doBoth$.subscribe();
pageClicks
.switchMapTo(nextPage$)
.subscribe();
highlightClicks
.do(highlight)
.subscribe();
bothClicks
.switchMapTo(doBoth$)
.subscribe();
這裏是鏈接更新後的小提琴:https://fiddle.jshell.net/r2L7k0mc/3/
根據您的意見我已經更新用下面的代碼你的提琴:
var page$ = events.page$.share();
var loadData$ = page$
.startWith(0)
.switchMap(page => loadData(page).takeUntil(page$))
.do(renderData);
loadData$.subscribe();
var loading$ = Rx.Observable.merge(
page$.mapTo(true),
loadData$.mapTo(false)
)
.startWith(false)
.publishReplay(1);
loading$.connect();
events.highlight$
.switchMap(function() {
return loading$
.filter(function(isLoading) { return !isLoading; })
.take(1);
})
.do(highlight)
.subscribe();
參見:https://fiddle.jshell.net/mc8h52r7/5/
不過我強烈建議重新考慮架構,因爲這是一個非常醜陋的集流,那肯定可以與不同的體系結構進行了優化。
請檢查你的小提琴,按鈕停止工作。 –
我已經更新了小提琴和代碼,現在應該可以正常工作 - 出於某種原因,它只在訂閱點擊流訂閱之前訂閱事件時才起作用 - 這可能是一個可能的rxjs錯誤,即使 – olsn
我已將rxjs更改爲beta .12和最後的'doBoth $ .subscribe()'版本開始工作。所以確實看起來像rxjs中的一個bug。 –