debounceTime() и ожидание событий

Я хотел бы сделать что-то в 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() в тему.

(Я предполагаю, что вопрос, который я действительно хочу задать: как создать объект из наблюдаемой?)

1 ответ

Вы не можете превратить Наблюдаемое в Субъект (только из Субъекта в Наблюдаемый, используя asObservable() оператор).

Очевидно, я не знаю, какой у вас сценарий использования, где вы хотите использовать тему, но вы можете взять Observable из Observable.fromEvent() и подписаться на тему. Затем этот субъект повторно отправит все значения из наблюдаемого, оставаясь при этом субъектом, в который можно позвонить 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
Другие вопросы по тегам