reactive extensions
前面講過(guò),異步很難.那么有沒(méi)有已經(jīng)定好的異步代碼解決方案呢?這里就介紹微軟主導(dǎo)的rx技術(shù).
rx是一種編程范式,最大的意義,在于提供了一套流式處理的解決方案.所以,基本上,主流語(yǔ)言,都有相對(duì)應(yīng)的Rx庫(kù).
這里我以Rxjs為基礎(chǔ),因?yàn)閖s基本上,人人都會(huì).注:我采用的是 EMCAScript 2015
拋出問(wèn)題
假設(shè)我現(xiàn)在控制八神庵,我要放一個(gè)八稚女,應(yīng)該怎么做? 下前下后+拳.
假設(shè)現(xiàn)在是你開(kāi)發(fā)拳皇97系統(tǒng),你要監(jiān)控玩家的輸入,并作出判定處理.那么問(wèn)題來(lái)了,你該怎么處理玩家不斷變化的行為?
利用Rx的思路分析這個(gè)問(wèn)題.
我們畫(huà)出當(dāng)前按鍵的事件流
keyup: ---r--亂七八糟一頓搓,并打夠了氣可以放超必殺----下-下-前--下--后--拳-拳---
這里,我們玩過(guò)游戲的知道,你出招過(guò)慢不行,根本不會(huì)放出大招.過(guò)快也不行,系統(tǒng)不會(huì)響應(yīng).
上面的keyup事件流開(kāi)始慢慢流進(jìn)系統(tǒng)緩沖區(qū),在緩沖區(qū)將事件流按照最小判定時(shí)間片段分隔為
buffer:--------r下上-拳-腳---..--下下前下后拳----
這里,我突然想起來(lái),八稚女是超必殺,我需要判斷氣夠不夠,于是,我們還要添加一個(gè)filter
氣夠否: ---F---F---F---T---T---T---T---T---F---
最終,我們把這個(gè)這個(gè)map到對(duì)應(yīng)的出招方法中.于是,我們的事件流就變成了下面這樣
八稚女: ---F---F---F---F---F---F---F---F---T---
Rx本質(zhì)(如何畫(huà)馬)
- 把一個(gè)可觀測(cè)對(duì)象,流式的把狀態(tài)放入緩沖區(qū)
- 迭代這個(gè)緩沖區(qū),產(chǎn)生新的流.并注冊(cè)回調(diào)方法監(jiān)控.
- 當(dāng)回調(diào)方法監(jiān)測(cè)到數(shù)據(jù)滿(mǎn)足的時(shí)候,執(zhí)行.
一言蔽之,不就是觀察者模式+迭代器+回調(diào)方法嘛....
Rx的模塊
- Observable: 可觀測(cè)序列源.看這個(gè)名字,就知道這個(gè)是Observer pattern的演化,通過(guò)觀測(cè)變化去產(chǎn)生對(duì)應(yīng)的操作.
- Observer: 觀察者實(shí)例丽已,用來(lái)決定何時(shí)觀察指定數(shù)據(jù).
- Subscription: 觀察數(shù)據(jù)序列返回訂閱實(shí)例.
- Operators: Observable的操作方法润文,包括轉(zhuǎn)換數(shù)據(jù)序列,過(guò)濾等秧秉,
所有的Operators方法接受的參數(shù)是上一次發(fā)送的數(shù)據(jù)變更的值眯亦,而方法返回值我們稱(chēng)之為發(fā)射新數(shù)據(jù)變更.
- Subject: 被觀察對(duì)象.
- Schedulers: 控制調(diào)度并發(fā)腰素,即當(dāng)Observable接受Subject的變更響應(yīng)時(shí)芦倒,可以通過(guò)scheduler設(shè)置響應(yīng)方式,目前內(nèi)置的響應(yīng)可以調(diào)用Object.keys(Rx.Subject)查看赴叹。
一個(gè)簡(jiǎn)單的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));