使用 RxJS 事件流进行简单的序列管理
Using RxJS event streams for simple sequence management
我正在尝试学习如何在事件流中思考,并且我试图通过在某些人为的场景中对其进行测试来解决这个问题。我坚持以下情况:
假设我有两个按钮,我们称它们为 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))
我假设logB$
是一个热门来源,就像clickA$
一样。
看起来像 logA$
= clickA$
.
对于logB$
:
logB$ = clickA$.flatMapLatest(function (clickA){
return clickB$.take(1);
});
flatMapLatest
允许您从 clickA$
中获取一个值,并将其关联到流,此处clickB$.take(1)
。 因此,flatMapLatest
将从该流发出值,直到完成,它将在从clickB$
发出第一个发出的值后(由于take(1)
)。当来自clickA$
的新值到达时,将取消订阅从前一个值派生的先前可观察量,并订阅从新值派生的可观察量。这给了你预期的行为。
文档链接 :
- 平面地图最新
- RxJS 中的平面映射运算符
相关文章:
- 简单的javascript在Shopify中不起作用
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 如何访问声音管理器2创建的声音对象
- JS编译器/包管理器,用于版本控制
- Firebase2(Firebase.google.com)推送通知-从外部管理
- 如何制作简单的php'在Javascript中的foreach等价物
- 以角度管理动态URL
- React Redux错误页面管理
- 让Webpack管理Quirky AMD定义的最佳方式
- 如何在p5.js中管理多智力竞赛游戏的多个屏幕
- JQuery:向多个匹配结果添加换行符的最简单方法
- PHP和Javascript的简单用户管理比较
- Polymer 1.0:管理简单项目列表的最佳实践
- 管理多个JS文件的简单方法
- 管理形式状态的最简单方法是什么
- 如何在不使用主题或命令式操作的情况下管理状态 在一个简单的 RxJS 示例中
- 使用 RxJS 事件流进行简单的序列管理
- Meteor后端管理界面:有没有任何软件包可以让这一切变得简单,一个la Django
- 如何使用ng-show和ng-hide在一个简单的条件下管理多个条件