如何理解Rxjs

1. 背景介紹

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

2. 知識(shí)剖析

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

  1. 什么是Observer最冰?
    Observer(觀察者)是Observable(可觀察對(duì)象)推送數(shù)據(jù)的消費(fèi)者。在RxJS中稀火,Observer是一個(gè)由回調(diào)函數(shù)組成的對(duì)象,鍵名分別為next赌朋、errorcomplete凰狞,以此接受Observable推送的不同類型的通知,下面的代碼段是Observer的一個(gè)示例:
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
    什么是Subscription赡若?Subscription是一個(gè)代表可以終止資源的對(duì)象,表示一個(gè)Observable的執(zhí)行過程团甲。Subscription有一個(gè)重要的方法:unsubscribe逾冬。這個(gè)方法不需要傳入?yún)?shù),調(diào)用后便會(huì)終止相應(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請(qǐng)求身腻?
// 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. 編碼實(shí)戰(zhàn)

  1. 一個(gè)小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的值是不會(huì)自動(dòng)更新為5的匹厘。
但是使用Rxjs方法就可以實(shí)現(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.另一個(gè)小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>

以上是兩個(gè)輸入框。

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 操作符其實(shí)是在組合2個(gè)源數(shù)據(jù)流中選擇最新的2個(gè)數(shù)據(jù)進(jìn)行配對(duì)愈诚,如果其中一個(gè)源之前沒有任何數(shù)據(jù)產(chǎn)生她按,那么結(jié)果流也不會(huì)產(chǎn)生數(shù)據(jù)牛隅。
所以,當(dāng)我們更新其中一個(gè)輸入框的值的時(shí)候酌泰,bmi值也會(huì)隨著變化媒佣。想一想,這個(gè)功能如果用js方法實(shí)現(xiàn)還是比較煩的陵刹。

5. 擴(kuò)展思考

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巡验,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碘耳,更是在濱河造成了極大的恐慌显设,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辛辨,死亡現(xiàn)場離奇詭異捕捂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)斗搞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門指攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人僻焚,你說我怎么就攤上這事允悦。” “怎么了虑啤?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵隙弛,是天一觀的道長。 經(jīng)常有香客問我狞山,道長全闷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任萍启,我火速辦了婚禮总珠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勘纯。我一直安慰自己局服,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布屡律。 她就那樣靜靜地躺著腌逢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪超埋。 梳的紋絲不亂的頭發(fā)上搏讶,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天佳鳖,我揣著相機(jī)與錄音,去河邊找鬼媒惕。 笑死系吩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妒蔚。 我是一名探鬼主播穿挨,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼肴盏!你這毒婦竟也來了科盛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤菜皂,失蹤者是張志新(化名)和其女友劉穎贞绵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恍飘,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榨崩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了章母。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片母蛛。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乳怎,靈堂內(nèi)的尸體忽然破棺而出彩郊,到底是詐尸還是另有隱情,我是刑警寧澤舞肆,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布焦辅,位于F島的核電站,受9級(jí)特大地震影響椿胯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剃根,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一哩盲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狈醉,春花似錦廉油、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渣慕,卻和暖如春嘶炭,著一層夾襖步出監(jiān)牢的瞬間抱慌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工眨猎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抑进,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓睡陪,卻偏偏與公主長得像寺渗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兰迫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

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