2016-11-28 169 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