可以這么說,響應(yīng)式編程是繼承自函數(shù)式編程。從Rx的官網(wǎng)上我們看到這樣的定義:
RxJS是結(jié)合了觀察者模式,迭代器模式和函數(shù)式編程優(yōu)點的產(chǎn)物。
觀察者模式在前文中已經(jīng)出現(xiàn)過了,下面我們來看看函數(shù)式編程和迭代器模式。
函數(shù)式編程
函數(shù)式編程是一種開發(fā)軟件的范式,強調(diào)使用函數(shù)來創(chuàng)建應(yīng)用程序。聲明式的,不可變的,沒有副作用的是函數(shù)式編程的三大護(hù)法。
其中不可變武功最高深。一直使用面向?qū)ο蠓妒骄幊痰奈覀?,?xí)慣了用變量存儲和追蹤程序的狀態(tài)。然而我們?nèi)绾卧谧兞坎豢勺兊那闆r下來完成同樣的功能呢?這里舉個鐘表時間的例子,從早上7點到早上8點,存儲時間的變量必然從7變成了8。用函數(shù)式的觀點,不能改變變量的值,那如何追蹤時間的變化,那就每走一秒,我們就重新創(chuàng)建個鐘表,在程序中就是新創(chuàng)建個實例,最終,我們得到的結(jié)果都是指向8點的鐘表。
RxJS從函數(shù)式編程范式中借鑒了很多東西,比如鏈?zhǔn)胶瘮?shù)調(diào)用,惰性求值等等。
其他兩大護(hù)法,我們簡單說一下。什么叫聲明式的語句,請參看SQL查詢語句的寫法。沒有副作用的,我們就看看什么是副作用:在函數(shù)中與函數(shù)作用域之外的一切事物有交互的就產(chǎn)生了副作用。比如讀寫文件,在控制臺打印語句,修改頁面元素的css等等。在RxJS中,把副作用問題推給了訂閱者來解決。其實副作用這個問題,大家早已熟悉了——編程中最忌諱的全局變量。說白了,共享的都是不安全的,尤其是在多線程,異步環(huán)境下,在這里就不多說了。函數(shù)式編程我會單開haskell系列來講。
迭代器模式
RxJS中一個關(guān)鍵的設(shè)計理念是遍歷機制。了解過迭代器設(shè)計模式的人應(yīng)該清楚,迭代器模式的主題思想就是不管要遍歷的數(shù)據(jù)結(jié)構(gòu)是什么,樹也好,圖也好,我們都用同樣的方式操作它們(for...of)。在ES6中引入了迭代器協(xié)議,具體內(nèi)容請參見http://es6.ruanyifeng.com/#docs/iterator。RxJS中的消費者(observer)也實現(xiàn)了類似的協(xié)議用來通知生產(chǎn)者(observable)繼續(xù)發(fā)送數(shù)據(jù)。
數(shù)據(jù)驅(qū)動開發(fā)
RxJS鼓勵使用數(shù)據(jù)驅(qū)動的方式進(jìn)行開發(fā)。數(shù)據(jù)驅(qū)動可以把數(shù)據(jù)和處理數(shù)據(jù)的行為分隔開來,這也是RxJS的核心設(shè)計決定,使我們可以用同樣的方式處理不同的數(shù)據(jù)源。