響應式編程(學習小結)

定義

維基百科:
響應式編程或反應式編程(英語: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

函數式編程

函數式編程就是很是強調使用函數來解決問題的一種編程方式。

此處的函數有特殊的要求:

  1. 聲明式
  2. 純函數
  3. 數據不可變性

命令式 vs 聲明式

//命令式:告訴計算機該怎麼作
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 ();//將遊標移動到下一個元素
}
複製代碼

Observable彈珠圖

在這裏插入圖片描述

彈珠圖

rxviz.com/examples/cu…

RxJS源碼

github.com/ReactiveX/r…

函數響應式編程的優點

數據流抽象了不少現實問題。 擅長處理異步操做。 把複雜問題分解成簡單問題的組合。

相關文章
相關標籤/搜索