javascript - RxJS 监听事件但稍后附加事件监听器

标签 javascript events rxjs

使用 RxJS,我想订阅事件。问题是:我想在设置事件监听器之前设置 Observable。

将其想象成两个按钮:按钮 1 在被单击时执行某些操作,但仅在按钮 2 将事件监听器附加到按钮 1 之后。观察者应该订阅 button1 的点击事件。所有这些都应该在应用程序启动时连接在一起。 Button2 不应该设置观察者!一些没有 RxJS 的代码:

button2.addEventListener('click', function() {
    // [...] some code to prevent that button1 has more than one event listener

    // attach event listener to button1
    button1.addEventListener('click', clickHandler);

    // now let observer subscribe itself to clickHandler somehow
    // -> HOW?
});


function clickHandler() {
    console.log("clicked");
}

编辑:也许,是否有可能观察到某种从不发出任何东西但在单击 button2 或类似事件后变成真正的事件处理程序 (clickHandler) 的虚拟事件处理程序?!

Edit2:我注意到 2 个按钮并不是最好的例子。让我们让它有所不同,并通过某种未知机制附加 button2 的事件监听器。例如:

// is called by unkown means, i. e. the observer doesn't know how and when its attached
function attach() {
    button1.addEventListener('click', clickHandler);
}

但是当 attach() 被调用时,Observer 应该订阅 clickHandler。或者可能 Observer 一直订阅某个函数,attach() 将函数替换为实际的事件监听器。不知道。

最佳答案

据我了解,您想创建一个 Observable,它会在 每次单击 button1,但仅在 button2 被单击之前的某个时间之后。

然后这应该工作:

var button1 = document.querySelector('#button1');
var button2 = document.querySelector('#button2');

var onButton2Click$ = Rx.Observable.fromEvent(button2, 'click').take(1);
var onButton1Click$ = Rx.Observable.fromEvent(button1, 'click').skipUntil(onButton2Click$);


onButton1Click$.subscribe(function(event) {
  console.log('button 1 clicked')
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>

<button id="button1">button 1</button>
<button id="button2">button 2</button>

应该清楚fromEvent是什么方法确实如此。

take带有参数 1 的运算符确保 onButton2Click$ observable 仅发出 1 个项目然后完成。

skipUntil运算符确保 onButton1Click$ observable 仅开始发射项目,直到 onButton2Click$ observable 发射至少 1 个项目。

对于编辑后的问题:

var button1 = document.querySelector('#button1');
var button2 = document.querySelector('#button2');

var onAttach$$ = new Rx.Subject();

function attach() {
  onAttach$$.next();
  onAttach$$.complete();
}

var onButton1Click$ = Rx.Observable.fromEvent(button1, 'click').skipUntil(onAttach$$);

// for testing only
button2.addEventListener('click', function(e) {
  attach();
});

onButton1Click$.subscribe(function(event) {
  console.log('button 1 clicked')
});

onAttach$$.subscribe(function() { 
  console.log('attached listener')
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>

<button id="button1">button 1</button>
<button id="button2">attach</button>

关于javascript - RxJS 监听事件但稍后附加事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46421769/

相关文章:

实时时间到达时的 JavaScript 23 :00

events - 处理从后台线程引发的事件

未处理 JavaFX onKeyPressed 事件

java - JMS持久异步事件通知

angular - 如何识别非常小的 Angular 应用程序中的内存泄漏

javascript - rxjs concatAll() 等价于 rxjava

javascript - Ant 和大于

javascript - 我需要椭圆保持居中并沿着线的长度来回移动

javascript - 将数字转换为日期的时刻

angular - 以 Angular 2 进行并行调用 http get 或 post 调用