RxJS簡單了解

今天通過《奇舞周刊》中的一篇《構(gòu)建流式應(yīng)用—RxJS詳解》對RxJS做了一個簡單的了解谋竖。
RxJS是Reactive Extensions for javascript的簡寫,我的理解是Javascript的靈活擴展揣钦。

文章借助RxJS優(yōu)化了使用普通方式實現(xiàn)的搜索功能。簡述一下該搜索功能粱哼,用戶輸入查詢內(nèi)容,后臺返回查詢結(jié)果狐粱。功能非常簡單,我們一般實現(xiàn)是獲取該搜索框胆数,兼聽搜索框的輸入事件肌蜻,將搜索框內(nèi)容發(fā)送到后臺,后臺根據(jù)搜索內(nèi)容返回數(shù)據(jù)必尼,前端拿到數(shù)據(jù)后展現(xiàn)到頁面蒋搜。

先來用普通方式實現(xiàn)一下這個搜索功能。

var input = document.querySelector("#text");
input.addEventListener("keyup",(e)=>{
    var searchText = e.target.value;
    $.ajax({
        url: `search.com/${searchText}`,
        success:data=>{
            render(data);
        }
    })
});

這里有兩點需要優(yōu)化:

  1. 多余的請求判莉。用戶的每次輸入都會做出響應(yīng)齿诞,比如用戶想搜索『手指餅』,結(jié)果【手】骂租,【指】兩個字都會觸發(fā)輸入事件。
  2. 已無用的請求仍再執(zhí)行斑司。用戶輸入【可樂】搜索結(jié)果沒有返回時渗饮,又輸入了【手指餅】,這時【可樂】的搜索結(jié)果返回了宿刮,這顯然是不正確的互站。

對于多余請求的情況可以使用定時器setTimeout的方式來處理。如下:

var input = document.querySelector("#test"),
      timer = null;
input.addEventListener('keyup',(e){
      clearTimeout(timer);
      timer = setTimeout(()=>{
            var searchText = e.target.value;
            $.ajax({
                url: `search.com/${searchText}`,
                success:data=>{
                    render(data);
                }
            })
      },250)
})

對于無用請求的處理僵缺,可以提前聲明一個當前搜索的狀態(tài)變量胡桃,并把這個狀態(tài)變量與數(shù)據(jù)一起返回,判斷該變量與當前輸入是不是相同磕潮,如果相同則把數(shù)據(jù)渲染到頁面翠胰。如下:

var input = document.querySelector("#test"),
      timer = null,
      currentSearch = "";
input.addEventListener('keyup',(e){
      clearTimeout(timer);
      timer = setTimeout(()=>{
            currentSearch = "書";
            var searchText = e.target.value;
            $.ajax({
                url: `search.com/${searchText}`,
                success:data=>{
                    if(data.search == currentSearch){
                        render(data);
                    }else{
                        ......
                    }
                }
            })
      },250)
})

這樣使用普通方式來實現(xiàn)搜索功能就完成了。下面我們看一下使用RxJS如何來實現(xiàn)該功能自脯。
首先實現(xiàn)個簡陋版的:

var input = document.querySelector("#test");
Rx.Observable.fromEvent(input,"keyup")
                        .pluck('target','value')
                        .flatMap(url=>Http.get(url))
                        .subscribe(data=>render(data))

在這里fromEvent之景、pluck、flatMap是RxJS提供的一系列操作膏潮,RxJS提供的操作非常豐富锻狗,想了解更多可以查詢RxJS文檔。這里的調(diào)用方式采用的鏈式調(diào)用焕参,使用過JQuery的話對鏈式調(diào)用是非常熟悉了轻纪。下面說明一下每句的作用:

Rx.Observable.fromEvent(input,"keyup")  // fromEvent用于兼聽事件,事件觸發(fā)時叠纷,將事件event轉(zhuǎn)成可流動的Observable進行傳輸刻帚。
.pluck("target","value") // 將輸入的event,輸出成event.target .value
.flatMap(url=>Http.get(url)) // 將請求搜索結(jié)果輸出回給Observer
.subscribe(data=>render(data)) // Observer針對返回的數(shù)據(jù)進行渲染

接下來看一下RxJS針對多余請求的優(yōu)化

var input = document.querySelector("#test");
Rx.Observable.fromEvent(input,"keyup")
                        .debounce(250) // 經(jīng)過250毫秒后,沒有流入新值讲岁,才將值轉(zhuǎn)入下一個環(huán)節(jié)
                        .pluck('target','value')
                        .flatMap(url=>Http.get(url))
                        .subscribe(data=>render(data))

RxJS針對無用請求的處理特別方便我擂,直接使用flatMapLatest替換flatMap:

var input = document.querySelector("#test");
Rx.Observable.fromEvent(input,"keyup")
                        .debounce(250) 
                        .pluck('target','value')
                        .flatMapLatest(url=>Http.get(url)) // 取消上一個已無用的請求衬以,只保留最后的請求結(jié)果流
                        .subscribe(data=>render(data))

這樣使用RxJS來實現(xiàn)搜索功能就完成了。對比兩種實現(xiàn)使用Rx從代碼量上有明顯的優(yōu)勢校摩。

文章簡單介紹了Rx的實現(xiàn)原理看峻,個人覺得Rx更像是鋼鐵廠,原材料(各類數(shù)據(jù)或事件)經(jīng)過高溫(Rx.Observable)轉(zhuǎn)成鋼水(流)衙吩,再經(jīng)過模具(Rx.Observer)得到想要的不同形式的鋼材(渲染)互妓。 RxJS以Asynchronous Data streams為核心,RxJS可以將事件坤塞,變量冯勉,屬性等等轉(zhuǎn)換成data streams,通過觀察這些data streams摹芙,并依據(jù)其創(chuàng)建的side effets進行對應(yīng)的操作灼狰。這只是個簡單的入門,《使用 RxJS 構(gòu)造復(fù)雜單頁應(yīng)用的數(shù)據(jù)邏輯》這篇文章針對RxJS的高級使用做了介紹浮禾,有興趣可以讀一下交胚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盈电,隨后出現(xiàn)的幾起案子蝴簇,更是在濱河造成了極大的恐慌,老刑警劉巖匆帚,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬词,死亡現(xiàn)場離奇詭異,居然都是意外死亡吸重,警方通過查閱死者的電腦和手機互拾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚎幸,“玉大人摩幔,你說我怎么就攤上這事”廾” “怎么了或衡?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長车遂。 經(jīng)常有香客問我封断,道長,這世上最難降的妖魔是什么舶担? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任坡疼,我火速辦了婚禮,結(jié)果婚禮上衣陶,老公的妹妹穿的比我還像新娘柄瑰。我一直安慰自己闸氮,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布教沾。 她就那樣靜靜地躺著蒲跨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪授翻。 梳的紋絲不亂的頭發(fā)上或悲,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音堪唐,去河邊找鬼巡语。 笑死,一個胖子當著我的面吹牛男公,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播合陵,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼理澎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曙寡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤寇荧,失蹤者是張志新(化名)和其女友劉穎举庶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揩抡,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡户侥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峦嗤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蕊唐。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烁设,靈堂內(nèi)的尸體忽然破棺而出替梨,到底是詐尸還是另有隱情,我是刑警寧澤装黑,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布副瀑,位于F島的核電站,受9級特大地震影響恋谭,放射性物質(zhì)發(fā)生泄漏糠睡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一疚颊、第九天 我趴在偏房一處隱蔽的房頂上張望狈孔。 院中可真熱鬧信认,春花似錦、人聲如沸均抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽到忽。三九已至橄教,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喘漏,已是汗流浹背护蝶。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翩迈,地道東北人持灰。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像负饲,于是被迫代替她去往敵國和親堤魁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理返十,服務(wù)發(fā)現(xiàn)妥泉,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,871評論 25 707
  • 擔(dān)憂 自己在網(wǎng)絡(luò)營銷行業(yè)待了將近6年時間了,也正因為待的時間越久越關(guān)心這個行業(yè)的未來迟杂,如果沒有未來刽沾,那自己豈不是在...
    夜貓子譚娟閱讀 480評論 0 0
  • 柳惠蘭是邯鄲新聞界的名人,后當過邯鄲廣播電視臺臺長和廣電局局長排拷,愛人李文海侧漓,曾獲全國新聞最高獎——韜奮獎,曾任《邯...
    雪琴吟閱讀 1,052評論 0 1
  • 我連忙不顧一切地抓住他的手监氢,原來人是會死的布蔗,原來相聚的緣分不可強求。我疑視傅于琛浪腐,像是想從他的瞳孔鉆進去何鸡,永生永世...
    溫柔亦有力量閱讀 582評論 0 0