angular RJX

RJX

RxJS 是 ReactiveX 編程理念的 JavaScript 版本贯涎。ReactiveX 來自微軟惹盼,它是一種針對異步數(shù)據(jù) 流的編程。簡單來說,它將一切數(shù)據(jù)甘萧,包括 HTTP 請求,DOM 事件或者普通數(shù)據(jù)等包裝成流 的形式昆箕,然后用強大豐富的操作符對流進行處理辕羽,使你能以同步編程的方式處理異步數(shù)據(jù), 并組合不同的操作符來輕松優(yōu)雅的實現(xiàn)你所需要的功能吨些。
RxJS 是一種針對異步數(shù)據(jù)流編程工具搓谆,或者叫響應式擴展編程;可不管如何解釋 RxJS 其目 標就是異步編程豪墅,Angular 引入 RxJS 為了就是讓異步可控泉手、更簡單。

  • 目前常見的異步編程的幾種方法:
    1偶器、回調(diào)函數(shù)
    2斩萌、事件監(jiān)聽/發(fā)布訂閱
    3缝裤、Promise
    4、Rxjs

Promise 和 RxJS 處理異步對比

  • Promise 處理異步:
let promise = new Promise(resolve => { 
setTimeout(() => { 
resolve('---promise timeout---'); }, 2000); 
}); 
promise.then(value => console.log(value));
  • RxJS 處理異步:
import {Observable} from 'rxjs';
let stream = new Observable(observer => {
setTimeout(() => { 
observer.next('observable timeout'); 
}, 2000); 
}); 
stream.subscribe(value => console.log(value));

Rxjs unsubscribe 取消訂閱

Promise 的創(chuàng)建之后颊郎,動作是無法撤回的憋飞。Observable 不一樣,動作可以通過 unsbscribe() 方 法中途撤回姆吭,而且 Observable 在內(nèi)部做了智能的處理

  • Rxjs 可以通過 unsubscribe() 可以撤回 subscribe 的動作
let stream = new Observable(observer => { 
let timeout = setTimeout(() => { 
clearTimeout(timeout); 
observer.next('observable timeout'); }, 
2000); 
}); 
let disposable = stream.subscribe(value =>
 console.log(value)); 
setTimeout(() => { 
//取消執(zhí)行 disposable.unsubscribe(); 
}, 1000);

Rxjs 訂閱后多次執(zhí)行

這一點 Promise 是做不到的榛做,對于 Promise 來說,最終結果要么 resole(兌現(xiàn))内狸、要么 reject (拒絕)瘤睹,而且都只能觸發(fā)一次。如果在同一個 Promise 對象上多次調(diào)用 resolve 方法答倡, 則會拋異常轰传。而 Observable 不一樣,它可以不斷地觸發(fā)下一個值瘪撇,就像 next() 這個方法的 名字所暗示的那樣获茬。

let stream = new Observable<number>(observer => { 
let count = 0; 
setInterval(() => { 
observer.next(count++); }, 
1000); 
}); 
stream.subscribe(value => console.log("Observable>"+value));

Rxjs 延遲執(zhí)行

import {Observable,fromEvent} from 'rxjs'; 
import {map,filter,throttleTime} from 'rxjs/operators'; 
var button = document.querySelector('button'); 
fromEvent(button, 'click').pipe( throttleTime(1000) ).subscribe(() => console.log(`Clicked`));
export class HomeComponent implements OnInit {
  constructor(public request:RequestService) { }
  ngOnInit() {
      //1、同步方法
      let data=this.request.getData();
      console.log(data)
      //2倔既、callback獲取異步數(shù)據(jù)
      this.request.getCallbackData((data)=>{
        console.log(data);
      });
      //3恕曲、promise獲取異步數(shù)據(jù)
      var promiseData=this.request.getPromiseData();
      promiseData.then((data)=>{
        console.log(data);
      })
      //4、rxjs獲取異步方法里面的數(shù)據(jù)
      // var rxjsData=this.request.getRxjsData();
      // rxjsData.subscribe((data)=>{
      //     console.log(data);
      // })
      //5渤涌、過一秒以后撤回剛才的操作
      var streem=this.request.getRxjsData();
      var d=streem.subscribe((data)=>{
          console.log(data);
      })
      setTimeout(()=>{
        d.unsubscribe();  /*取消訂閱*/
      },1000)
      //6佩谣、promise 執(zhí)行多次(沒有這個能力)
      var intervalData=this.request.getPromiseIntervalData();
      intervalData.then((data)=>{
         console.log(data);
      })
      //7、rxjs執(zhí)行多次
      // var streemInterval=this.request.getRxjsIntervalData();
      // streemInterval.subscribe((data)=>{
      //     console.log(data);
      // })
      //8实蓬、用工具方法對返回的數(shù)據(jù)進行處理
      /*
        var streemNum=this.request.getRxjsIntervalNum();
        streemNum.pipe(
          filter((value)=>{
              if(value%2==0){
                return true;
              }
          })
        )      
        .subscribe((data)=>{
            console.log(data);
        })
      */
      /*
           var streemNum=this.request.getRxjsIntervalNum();
            streemNum.pipe(
              map((value)=>{
                return value*value;
              })
            )      
            .subscribe((data)=>{
                console.log(data);
            })
      */
     var streemNum=this.request.getRxjsIntervalNum();
     streemNum.pipe(
       filter((value)=>{
          if(value%2==0){
            return true;
          }
      }),
       map((value)=>{
         return value*value;
       })
     )      
     .subscribe((data)=>{
         console.log(data);
     })
  }
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茸俭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子安皱,更是在濱河造成了極大的恐慌调鬓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酌伊,死亡現(xiàn)場離奇詭異腾窝,居然都是意外死亡,警方通過查閱死者的電腦和手機居砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門虹脯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奏候,你說我怎么就攤上這事循集。” “怎么了鼻由?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵暇榴,是天一觀的道長厚棵。 經(jīng)常有香客問我蕉世,道長蔼紧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任狠轻,我火速辦了婚禮奸例,結果婚禮上,老公的妹妹穿的比我還像新娘向楼。我一直安慰自己查吊,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布湖蜕。 她就那樣靜靜地躺著逻卖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昭抒。 梳的紋絲不亂的頭發(fā)上评也,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音灭返,去河邊找鬼盗迟。 笑死,一個胖子當著我的面吹牛熙含,可吹牛的內(nèi)容都是我干的罚缕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怎静,長吁一口氣:“原來是場噩夢啊……” “哼邮弹!你這毒婦竟也來了?” 一聲冷哼從身側響起蚓聘,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤肠鲫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后或粮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體导饲,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年氯材,在試婚紗的時候發(fā)現(xiàn)自己被綠了渣锦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡氢哮,死狀恐怖袋毙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冗尤,我是刑警寧澤听盖,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布胀溺,位于F島的核電站,受9級特大地震影響皆看,放射性物質發(fā)生泄漏仓坞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一腰吟、第九天 我趴在偏房一處隱蔽的房頂上張望无埃。 院中可真熱鬧,春花似錦毛雇、人聲如沸嫉称。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽织阅。三九已至,卻和暖如春震捣,著一層夾襖步出監(jiān)牢的瞬間荔棉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工伍派, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留江耀,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓诉植,卻偏偏與公主長得像祥国,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晾腔,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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

  • 一.背景介紹 Rx(Reactive Extension -- 響應式擴展 http://reactivex.io...
    愛上Shu的小刺猬閱讀 2,043評論 1 3
  • 介紹 RxJS是一個異步編程的庫舌稀,同時它通過observable序列來實現(xiàn)基于事件的編程。它提供了一個核心的類型:...
    泓滎閱讀 16,601評論 0 12
  • 推薦我的Rxjs教程:Rxjs系列教程目錄 前言 隨著開發(fā)中項目的越來越大灼擂,代碼的要求越來越高壁查,于是開始四處搜找各...
    儂姝沁兒閱讀 10,188評論 1 6
  • 響應式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式。面向變化傳播的編程就是看最初的數(shù)據(jù)是否會隨著后續(xù)對應變量的變化而變...
    oWSQo閱讀 769評論 0 0
  • title: RxJS簡介date: 2017-08-01 09:45:33tags: [JavaScript, ...
    color_cat閱讀 293評論 0 0