RxJS官方教程(六) 算子

Operator 算子

雖然Observable是RxJS的基礎(chǔ)店诗,但是它的好用主要在于其算子庞瘸。算子允許以聲明方式輕松組合復(fù)雜異步代碼擦囊。

什么是算子瞬场?

算子是Observable的一種方法贯被,如.map(...)彤灶,.filter(...)幌陕,.merge(...)搏熄,當(dāng)調(diào)用時(shí)搬卒,它們不會(huì)改變現(xiàn)有的Observable契邀。相反微饥,它們返回一個(gè)新的 Observable,其訂閱邏輯基于第一個(gè)Observable矩肩。

算子是一個(gè)基于當(dāng)前Observable創(chuàng)建新Observable的函數(shù)。這是一個(gè)純粹的操作:前一個(gè)Observable保持不變刽酱。

算子本質(zhì)上是一個(gè)純函數(shù)棵里,它將一個(gè)Observable作為輸入殿怜,并生成另一個(gè)Observable作為輸出头谜。訂閱輸出的Observable也將訂閱輸入的Observable乔夯。在下面的示例中,我們創(chuàng)建一個(gè)自定義算子新锈,將從輸入Observable接收的每個(gè)值乘以10:

function multiplyByTen(input) {
    var output = Rx.Observable.create(function subscribe(observer) {
        input.subscribe({
            next: (v) => observer.next(10 * v),
            error: (err) => observer.error(err),
            complete: () => observer.complete()
        });
    });
    return output;
}

var input = Rx.Observable.from([1,2,3,4]);
var output = multiplyByTen(input);
output.subscribe(x => console.log(x));

輸出:

10
20
30
40

請(qǐng)注意,訂閱output將導(dǎo)致input訂閱Observable拳缠。我們稱(chēng)之為“算子訂閱鏈”窟坐。

實(shí)例算子與靜態(tài)算子

什么是實(shí)例算子哲鸳?通常在引用算子時(shí)徙菠,當(dāng)它們是Observable實(shí)例上的方法婿奔,我們稱(chēng)它是實(shí)例算子萍摊。例如记餐,如果運(yùn)算符multiplyByTen是官方實(shí)例算子片酝,它看起來(lái)大致如下:

Rx.Observable.prototype.multiplyByTen = function multiplyByTen() {
  var input = this;
  return Rx.Observable.create(function subscribe(observer) {
    input.subscribe({
      next: (v) => observer.next(10 * v),
      error: (err) => observer.error(err),
      complete: () => observer.complete()
    });
  });
}

實(shí)例算子是使用this關(guān)鍵字來(lái)推斷什么是輸入Observable的函數(shù)雕沿。

注意inputObservable不再是函數(shù)參數(shù)审轮,它被假定為this對(duì)象篡诽。這就是我們?nèi)绾问褂眠@樣的實(shí)例算子:

var observable = Rx.Observable.from([1, 2, 3, 4]).multiplyByTen();

observable.subscribe(x => console.log(x));

什么是靜態(tài)算子杈女?除了實(shí)例算子达椰,靜態(tài)算子是直接附加到Observable類(lèi)的函數(shù)啰劲。靜態(tài)算子在內(nèi)部不使用this關(guān)鍵字趁尼,而是完全依賴(lài)于其參數(shù)猖辫。

靜態(tài)算子是附加到Observable類(lèi)的純函數(shù)芝囤,通常用于從頭創(chuàng)建Observable悯姊。

最常見(jiàn)的靜態(tài)算子類(lèi)型是所謂的Creation Operators悯许。它們不是將輸入Observable轉(zhuǎn)換為輸出Observable,而是簡(jiǎn)單地采用非Observable參數(shù)垃僚,如數(shù)字规辱,并創(chuàng)建一個(gè)新的Observable谆棺。

靜態(tài)創(chuàng)建算子的典型示例是interval函數(shù)。它需要一個(gè)數(shù)字(不是Observable)作為輸入?yún)?shù)罕袋,并產(chǎn)生一個(gè)Observable作為輸出:

var observable = Rx.Observable.interval(1000 /* number of milliseconds */);

創(chuàng)建算子的另一個(gè)例子是我們?cè)谇懊娴睦又袕V泛使用的create改淑。請(qǐng)?jiān)?a target="_blank" rel="nofollow">此處查看所有靜態(tài)創(chuàng)建算子的列表。

但是浴讯,靜態(tài)算子可能與簡(jiǎn)單創(chuàng)建的性質(zhì)不同朵夏。一些聯(lián)合算子可以是靜態(tài)的兰珍,例如merge侍郭,combineLatest询吴,concat等等掠河,因?yàn)樗麄儾扇?em>多種觀測(cè)量作為輸入,不只是一個(gè)猛计,例如:

var observable1 = Rx.Observable.interval(1000);
var observable2 = Rx.Observable.interval(400);

var merged = Rx.Observable.merge(observable1, observable2);

彈珠圖

為了解釋算子的工作原理唠摹,文本描述通常是不夠的。許多算子與時(shí)間有關(guān)奉瘤,例如他們可能以不同的方式延遲勾拉,采樣煮甥,節(jié)流或去抖值。圖表通常是更好的工具藕赞。Marble Diagrams是算子工作方式的可視化表示成肘,包括輸入Observable(s),算子及其參數(shù)以及輸出Observable斧蜕。

在彈珠圖中双霍,時(shí)間流向右側(cè),圖表描述了如何在Observable執(zhí)行中發(fā)出值(“彈珠”)批销。

您可以在下面看到彈珠圖的解剖結(jié)構(gòu)洒闸。

suanzi.png

在整個(gè)文檔站點(diǎn)中,我們廣泛使用彈珠圖來(lái)解釋算子的工作方式均芽。它們?cè)谄渌h(huán)境中也可能非常有用丘逸,例如在白板上甚至在我們的單元測(cè)試中(如ASCII圖)。

選擇一個(gè)算子

您是否需要為您的問(wèn)題找到算子掀宋?首先從下面的列表中選擇一個(gè)選項(xiàng):

  • 我有一個(gè)現(xiàn)有的Observable深纲,...
  • 我有一些Observables作為一個(gè)Observable組合在一起,并且......
  • 我還沒(méi)有Observables劲妙,而且......

算子的類(lèi)別

存在用于不同目的的算子囤萤,它們可以被分類(lèi)為:創(chuàng)建,轉(zhuǎn)換是趴,過(guò)濾涛舍,組合,多播唆途,錯(cuò)誤處理富雅,工具等。在以下列表中肛搬,您將找到按類(lèi)別組織的所有算子没佑。

創(chuàng)建算子

轉(zhuǎn)換算子

過(guò)濾算子

組合算子

廣播算子

錯(cuò)誤處理算子

通用算子

條件和布爾算子

數(shù)學(xué)和聚合算子

官網(wǎng) http://reactivex.io/rxjs/manual/overview.html#operators

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市温赔,隨后出現(xiàn)的幾起案子蛤奢,更是在濱河造成了極大的恐慌,老刑警劉巖陶贼,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啤贩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拜秧,警方通過(guò)查閱死者的電腦和手機(jī)痹屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枉氮,“玉大人志衍,你說(shuō)我怎么就攤上這事暖庄。” “怎么了楼肪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵培廓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我春叫,道長(zhǎng)医舆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任象缀,我火速辦了婚禮蔬将,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘央星。我一直安慰自己霞怀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布莉给。 她就那樣靜靜地躺著毙石,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颓遏。 梳的紋絲不亂的頭發(fā)上徐矩,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音叁幢,去河邊找鬼滤灯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛曼玩,可吹牛的內(nèi)容都是我干的鳞骤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黍判,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼豫尽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起顷帖,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤美旧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后贬墩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榴嗅,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年震糖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了录肯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吊说,死狀恐怖论咏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颁井,我是刑警寧澤厅贪,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站雅宾,受9級(jí)特大地震影響养涮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眉抬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一贯吓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜀变,春花似錦悄谐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至寒瓦,卻和暖如春情屹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杂腰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工垃你, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喂很。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓蜡镶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恤筛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子官还,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)毒坛,斷路器望伦,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的煎殷,對(duì)什么是操作屯伞、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,851評(píng)論 0 10
  • 介紹 RxJS是一個(gè)異步編程的庫(kù),同時(shí)它通過(guò)observable序列來(lái)實(shí)現(xiàn)基于事件的編程豪直。它提供了一個(gè)核心的類(lèi)型:...
    泓滎閱讀 16,590評(píng)論 0 12
  • 〖每日拔拔草〗三度思維空性 今天黃建紅打電話(huà)催款劣摇,我出差前已經(jīng)看到他的應(yīng)付款不多,就決定先不付弓乙,今天聽(tīng)到他的意思是...
    lindacheng2017閱讀 260評(píng)論 0 0
  • 早上送孩子末融,聽(tīng)朋友說(shuō)起钧惧,院里有個(gè)男人因?yàn)殡x婚心情郁悶,整日喝酒勾习,昨天大出血死了浓瞪,留下一個(gè)年幼的孩子和老邁...
    菩提樹(shù)下一沙粒閱讀 356評(píng)論 2 1