Rx粗糙介绍

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本质(如何画马)

  1. 把一个可观测对象,流式的把状态放入缓冲区
  2. 迭代这个缓冲区,产生新的流.并注册回调方法监控.
  3. 当回调方法监测到数据满足的时候,执行.
    一言蔽之,不就是观察者模式+迭代器+回调方法嘛....

Rx的模块

  1. Observable: 可观测序列源.看这个名字,就知道这个是Observer pattern的演化,通过观测变化去产生对应的操作.
  2. Observer: 观察者实例,用来决定何时观察指定数据.
  3. Subscription: 观察数据序列返回订阅实例.
  4. Operators: Observable的操作方法,包括转换数据序列,过滤等,
    所有的Operators方法接受的参数是上一次发送的数据变更的值,而方法返回值我们称之为发射新数据变更.
  5. Subject: 被观察对象.
  6. 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));

你可能感兴趣的:(Rx粗糙介绍)