2016-11-28 99 views
2

我想完成的RxJS的东西,我会用英文表达是这样的:debounceTime(),并等待事件

等待一个事件从一个流提出,执行某些功能,然后等待从这个流中静默五秒钟,然后执行另一个功能。

我曾在这几次尝试。流我想订阅看起来像这样:

this.documentClick$ = Observable.fromEvent(document.querySelector('body'), 'mousemove') 
    .merge(Observable.fromEvent(document.querySelector('body'), 'click')); 

目前的二个竞争者做的工作,但每个有其缺点:

this.documentClick$ 
    .subscribe(() => { 
     this.toolbarsVisible = 'visible'; 
    }); 

this.documentClick$ 
    .debounceTime(5000) 
    .subscribe(() => { 
     this.toolbarsVisible = 'hidden'; 
    }); 

this.documentClick$ 
    .do(() => { 
     this.toolbarsVisible = 'visible'; 
    }) 
    .debounceTime(3000) 
    .subscribe(() => { 
     this.toolbarsVisible = 'hidden'; 
    }); 

是什么这样做的“最正确”的方式?我想用一个主题将是最好的,但我不能得到Observable.fromEvent()进入主题。

(我想这个问题我真的要问的是:如何从可观察到的创建主题?)

回答

0

使用asObservable()运营商不能把一个可观察的主题(仅除可观测)。

很明显,我不知道你在什么情况下使用主题,但你可以从Observable.fromEvent()获取Observable并订阅Subject。然后,这一主题将重新发射从可观察的所有值,同时仍然是一个主题,你可以打电话next()或什么的。

一个简单的演示示出这样的情况:

let subject = new Subject(); 
subject.subscribe(val => console.log('subject', val)); 

Observable.interval(250) 
    .subscribe(subject); 

Observable.interval(1000) 
    .subscribe(val => subject.next('Hello ' + val)); 

参见现场演示:https://jsbin.com/zejata/edit?js,console

该输出例如:

subject 0 
subject 1 
subject 2 
subject Hello 0 
subject 3 
subject 4 
subject 5 
subject 6 
subject Hello 1 
subject 7 
subject 8