我正在尝试学习如何在事件流中进行思考,并且试图通过在一些人为的场景中对其进行测试来围绕它进行思考。我坚持以下情况:
假设我有两个按钮,我们将它们称为A
和B
。A
可以随时点击。B
也可以被点击,但前提A
是之前被点击过。换句话说,B
永远不能连续点击两次。这是相应的弹珠图(其中 x 表示事件被忽略):
clickA$ --------o--------o-------->
| |
clickB$ --o--o--|--o--o--|--o--o-->
x x | | x | | x
logA$ --------o--|-----o--|----->
| |
logB$ -----------o--------o----->
标准方法是将状态存储在标志中并使用 if/else 控制块做出决策,如下所示:
var a = document.getElementById('a');
var b = document.getElementById('b');
var flag = false;
a.attachEventListener('click', function(e){
flag = true;
console.log("A");
});
b.attachEventListener('click', function(e){
if (flag) {
flag = false;
console.log("B");
}
});
我觉得应该有一种干净、简洁的方式来做到这一点,而不需要标志或一些超级混乱的事件流合并,但它让我无法理解。RxJS 中是否有一个someMethod()
这样我们可以执行以下操作以获得预期的效果?
var a = document.getElementById('a');
var b = document.getElementById('b');
var a$ = Rx.Observable.fromEvent(a, "click").map(e => "A")
var b$ = Rx.Observable.fromEvent(b, "click").map(e => "B")
.someMethod(a$)
a$.subscribe(x => console.log(x))
b$.subscribe(x => console.log(x))