如何理解Rxjs

1. 背景介紹

  1. 什么是RxJs
    RxJS是一種針對異步數(shù)據(jù)流編程工具,或者叫響應(yīng)式擴展編程;可不管如何解釋RxJS其目標(biāo)就是異步編程,Angular引入RxJS為了就是讓異步可控、更簡單。
  2. 響應(yīng)式編程:在計算領(lǐng)域,響應(yīng)式編程一種面向數(shù)據(jù)流和變化傳播的編程范式。這意味著可以在編程語言中很方便地表達(dá)靜態(tài)或動態(tài)的數(shù)據(jù)流,而相關(guān)的計算模型會自動將變化的值通過數(shù)據(jù)流進(jìn)行傳播。

2. 知識剖析

Rxjs中的兩個重要概念:Observer(觀察者)和Subscription

  1. 什么是Observer
    Observer(觀察者)是Observable(可觀察對象)推送數(shù)據(jù)的消費者。在RxJS中,Observer是一個由回調(diào)函數(shù)組成的對象,鍵名分別為nexterrorcomplete,以此接受Observable推送的不同類型的通知,下面的代碼段是Observer的一個示例:
var observer = {
      next: x => console.log('Observer got a next value: ' + x),   
      error: err => console.error('Observer got an error: ' + err),
      complete: () => console.log('Observer got a complete notification'),
    };
    // next / error / compelete 可缺

    調(diào)用Observer邏輯,只需在subscribe(訂閱)Observable后將Observer傳入

    observable.subscribe(observer);
  1. 什么是Subscription
    什么是SubscriptionSubscription是一個代表可以終止資源的對象,表示一個Observable的執(zhí)行過程。Subscription有一個重要的方法:unsubscribe。這個方法不需要傳入?yún)?shù),調(diào)用后便會終止相應(yīng)的資源。
      var observable = Rx.Observable.interval(1000);
      var subscription = observable.subscribe(x => console.log(x));

      subscription.unsubscribe(); 

3. 常見問題

Angular 4 中如何使用Rxjs進(jìn)行http請求?
// http get method   service

    public getAricle(url: string, searchText: URLSearchParams) {

        private getService: any = new Observable();

        this.getService = this.http.put(url, body options)
            .map(...)
            .catch(...);
    }

    // component
    this.servcieName.subscribe(data => {});

4. 編碼實戰(zhàn)

  1. 一個小demo
    var a, b = 1, c =2;
    a = b + c;
    console.log('b=' + b);
    console.log('c=' + c);
    console.log('a=' + a);
    b = 3;
    c = 2;

    console.log('a=' + a);

這段中,我們?nèi)绻胱?code>a輸出為5,就是當(dāng)bc二次賦值后a的值是不會自動更新為5的。
但是使用Rxjs方法就可以實現(xiàn)。

    var b$ = Rx.Observable.from([1, 3]);
    var c$ = Rx.Observable.from([2, 2]);

    var a$ = Rx.Observable.zip(b$, c$, (b, c) => {
        console.log('b=' + b);
        console.log('c=' + c);

        return b + c;

    });

a$.subscribe(a => console.log('a=' + a));

2.另一個小demo

<html>
<head>
  <!---引入Rxjs--->
  <script src="https://unpkg.com/@reactivex/rxjs@5.0.0-beta.7/dist/global/Rx.umd.js"></script>
</head>
<body>
  Weight: <input type="number" id="weight"> kg
  <br/>
  Height: <input type="number" id="height"> cm
  <br/>
  Your BMI is <div id="bmi"></div>
</body>

以上是兩個輸入框。

let weight = document.getElementById('weight');
let height = document.getElementById('height');
let bmi = document.getElementById('bmi');

let weight$ = Rx.Observable
                .fromEvent(weight, 'input')
                .pluck('target', 'value');

let height$ = Rx.Observable
                .fromEvent(height, 'input')
                .pluck('target', 'value');

let bmi$ = Rx.Observable
              .combineLatest(weight$, height$, (w, h) => w/(h*h/100/100));

bmi$.subscribe(b => bmi.innerHTML=b);

combineLatest 操作符其實是在組合2個源數(shù)據(jù)流中選擇最新的2個數(shù)據(jù)進(jìn)行配對,如果其中一個源之前沒有任何數(shù)據(jù)產(chǎn)生,那么結(jié)果流也不會產(chǎn)生數(shù)據(jù)。
所以,當(dāng)我們更新其中一個輸入框的值的時候,bmi值也會隨著變化。想一想,這個功能如果用js方法實現(xiàn)還是比較煩的。

5. 擴展思考

Observable 如何轉(zhuǎn) Promise

public getAricle(url: string, searchText: URLSearchParams) {

  private getService: any = new Observable();

  this.getService = this.http.put(url, body options)
      .toPromise()   // 看到?jīng)],這樣
      .map(...)
      .catch(...);
}

6. 參考文獻(xiàn)

Rx--隱藏在Angular 中的利劍
RxJS 核心概念Observer Subscription
30天精通Rxjs
介紹RxJS在Angular中的應(yīng)用

7. 更多討論

Observable 和 Promise有什么區(qū)別?


Observable 和 Promise 主要區(qū)別
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一.背景介紹 Rx(Reactive Extension -- 響應(yīng)式擴展 http://reactivex.io...
    愛上Shu的小刺猬閱讀 2,094評論 1 3
  • 介紹 RxJS是一個異步編程的庫,同時它通過observable序列來實現(xiàn)基于事件的編程。它提供了一個核心的類型:...
    泓滎閱讀 16,639評論 0 12
  • 發(fā)現(xiàn) 關(guān)注 消息 RxSwift入坑解讀-你所需要知道的各種概念 沸沸騰關(guān)注 2016.11.27 19:11*字...
    楓葉1234閱讀 2,840評論 0 2
  • title: RxJS簡介date: 2017-08-01 09:45:33tags: [JavaScript, ...
    color_cat閱讀 312評論 0 0
  • 從前兩天開始,微信朋友圈就被各種和高考有關(guān)的信息刷屏了,昨天語文考試結(jié)束,高考作文題更是被熱議了一番,許多人還不甘...
    keerqin閱讀 331評論 2 2