debounceTime()并等待事件

时间:2016-11-28 12:23:54

标签: javascript rxjs reactive-programming rxjs5

我想在RxJS中完成一些我会用英语表达的东西:

  

等待从流中引发事件,执行某些功能,然后等待此流的五秒钟静音,然后执行另一个功能。

我曾多次尝试过。我要订阅的流看起来像这样:

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()引入主题。

(我想我真正想问的问题是:如何从Observable创建一个主题?)

1 个答案:

答案 0 :(得分:0)

您不能使用asObservable()运算符来转换主题中的Observable(仅从Subject到Observable)。

显然我不知道你在哪个用例 - 你想使用Subject但你可以从Observable.fromEvent()获取Observable并订阅一个Subject。然后,此主题将重新发出Observable中的所有值,同时仍然是一个主题,您可以调用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