reactive extensions
前面讲过,异步很难.那么有没有已经定好的异步代码解决方案呢?这里就介绍微软主导的rx技术.
rx是一种编程范式,最大的意义,在于提供了一套流式处理的解决方案.所以,基本上,主流语言,都有相对应的Rx库.
这里我以Rxjs为基础,因为js基本上,人人都会.注:我采用的是 EMCAScript 2015
抛出问题
假设我现在控制八神庵,我要放一个八稚女,应该怎么做? 下前下后+拳.
假设现在是你开发拳皇97系统,你要监控玩家的输入,并作出判定处理.那么问题来了,你该怎么处理玩家不断变化的行为?
利用Rx的思路分析这个问题.
我们画出当前按键的事件流
keyup: ---r--乱七八糟一顿搓,并打够了气可以放超必杀----下-下-前--下--后--拳-拳---
这里,我们玩过游戏的知道,你出招过慢不行,根本不会放出大招.过快也不行,系统不会响应.
上面的keyup事件流开始慢慢流进系统缓冲区,在缓冲区将事件流按照最小判定时间片段分隔为
buffer:--------r下上-拳-脚---..--下下前下后拳----
这里,我突然想起来,八稚女是超必杀,我需要判断气够不够,于是,我们还要添加一个filter
气够否: ---F---F---F---T---T---T---T---T---F---
最终,我们把这个这个map到对应的出招方法中.于是,我们的事件流就变成了下面这样
八稚女: ---F---F---F---F---F---F---F---F---T---
Rx本质(如何画马)
- 把一个可观测对象,流式的把状态放入缓冲区
- 迭代这个缓冲区,产生新的流.并注册回调方法监控.
- 当回调方法监测到数据满足的时候,执行.
一言蔽之,不就是观察者模式+迭代器+回调方法嘛....
Rx的模块
- Observable: 可观测序列源.看这个名字,就知道这个是Observer pattern的演化,通过观测变化去产生对应的操作.
- Observer: 观察者实例,用来决定何时观察指定数据.
- Subscription: 观察数据序列返回订阅实例.
- Operators: Observable的操作方法,包括转换数据序列,过滤等,
所有的Operators方法接受的参数是上一次发送的数据变更的值,而方法返回值我们称之为发射新数据变更.
- Subject: 被观察对象.
- Schedulers: 控制调度并发,即当Observable接受Subject的变更响应时,可以通过scheduler设置响应方式,目前内置的响应可以调用Object.keys(Rx.Subject)查看。
一个简单的Rx例子
// 5.0.0-rc.1
import Rx from 'rxjs';
//emit 1 from promise
const source = Rx.Observable.fromPromise(new Promise(resolve => resolve(1)));
//add 10 to the value
const example = source.map(val => val + 10);
//output: 11
const subscribe = example.subscribe(val => console.log(val));
网友评论