推迟观察到另一个时RxJs

问题描述:

解雇我有一个页面,两个订阅桌子上:推迟观察到另一个时RxJs

  1. 第一个重新加载表数据。它有一个延迟,因为它调用一个API。
  2. 第二个亮点数据。不影响表格数据。

当订阅逐一触发时,一切都可以,但是当它们在同一时间触发数据时会突出显示,并且很快在重新加载后突出显示消失。

你可以看到它here

是否有办法推迟突出显示如果重新加载是在行动?

也许我可以通过引入loading变量来完成此操作,但我正在寻找reactiveX解决方案。

在此先感谢。

请记住,在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/

不过我强烈建议重新考虑架构,因为这是一个非常丑陋的集流,那肯定可以与不同的体系结构进行了优化。

+0

请检查你的小提琴,按钮停止工作。 –

+0

我已经更新了小提琴和代码,现在应该可以正常工作 - 出于某种原因,它只在订阅点击流订阅之前订阅事件时才起作用 - 这可能是一个可能的rxjs错误,即使 – olsn

+0

我已将rxjs更改为beta .12和最后的'doBoth $ .subscribe()'版本开始工作。所以确实看起来像rxjs中的一个bug。 –