維基百科:
響應式編程或反應式編程(英語:Reactive programming)是一種面向數據流和變化傳播的編程範式。javascript
對於響應式編程,不一樣語言都有相應的擴展庫。例如RxJava、RxAndroid、RxJS等等。java
官網:
An API for asynchronous programming with observable streams 用於使用可觀察流進行異步編程的APIgit
我的理解:
建立出數據流(事件流),使用操做符對數據流進行組合和轉換,訂閱此數據流來執行其餘功能。或者說監聽到數據流後來執行其餘功能。github
關鍵詞:數據流、操做符、訂閱、異步編程編程
Reactive Extension,也叫ReactiveX,或者簡稱Rx,指的是實踐響應式編程的一套工具(庫)。 改進了異步編程模型。 開發語言並無天生對響應式編程支持,因此須要對編程語言作一層功能擴展。安全
例如:RxJava、RxJs、RxAndroid數據結構
它對觀察者模式進行了擴展,以支持數據和(或)事件序列;並添加許多運算符,這些運算符能夠以聲明方式組合;同時抽象出對如下問題的關注:低級線程,同步,線程安全,併發數據結構和非線程等。併發
響應式編程結合了以下三種優秀的思想:異步
下面重點說一下函數式編程async
函數式編程就是很是強調使用函數來解決問題的一種編程方式。
此處的函數有特殊的要求:
//命令式:告訴計算機該怎麼作
function double(arr) {
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] * 2)
}
return results
}
//聲明式:告訴計算機作什麼
function double(arr) {
return arr.map(function(item) {
return item * 2
});
}
複製代碼
函數的執行過程徹底由輸入參數決定,不會受除參數以外的任何數據影響。 函數不會修改任何外部狀態,如修改全局變量或傳入的參數對象。
const array = [1, 2, 3];
const newArray = double(array);
//array 的值是[1,2,3]
//newArray 的值是[2,4,6]
const originalArray = [1, 2, 3];
const pushedArray = arrayPush(originalArray, 4);
const doubledPushedArray = double(pushedArray);
// pushedArray值應該是[ 1, 2, 3, 4 ]
// doubledPushedArray值應該是 [ 2, 4, 6, 8 ]
const doubleOriginArray = double(originalArray);
//doubleOriginArray值應該是 [ 2, 4, 6, 8 ]; originalArray被arrayPush方法修改了。
//再看arrayPush代碼,顯然不是一個純函數
function arrayPush (arr, newValue) {
arr.push(newValue);
return arr;
}
//修改以下
function arrayPush (arr, newValue) {
return [...arr, newValue];
}
複製代碼
程序中的數據天然是須要變化的。這裏的不可變性是指保持原有數據不變。 當咱們須要數據狀態發生改變時,保持原有數據不變,產生一個新的數據來體現這種變化。
可以遍歷一個數據集合的對象。就是提供一個通用的接口,讓使用者徹底不用關心這個數據集合的具體實現方式。
const iterator = getIterator();
while (iterator.isDone()) {//是否遍歷完全部元素
console.log(iterator.getCurrent());//獲取當前遊標所指向的元素
iterator.moveToNext ();//將遊標移動到下一個元素
}
複製代碼
數據流抽象了不少現實問題。 擅長處理異步操做。 把複雜問題分解成簡單問題的組合。