RxJS系列教程(六) Observable和Observer

自定義創(chuàng)建Observable

前文中我們已經(jīng)使用RxJS提供給我們的from()和of()函數(shù)創(chuàng)建Observable對象糠悯。然而Observable是如何和Observer交互的与涡,以及如何取消訂閱,都有助于我們理解RxJS是如何運作的宽涌。

這里我們要做的是實現(xiàn)一個observable函數(shù),接收一些參數(shù),返回一個對象嗤军,比如叫subscription對象残黑。我們利用這個對象來釋放資源馍佑。

const observable = dataSource => {
  const INTERVAL = 1000;
  let schedulerId;
  
  return {
    subscribe: observer => {//接受一個observer作為參數(shù)
      schedulerId = setInterval(() => {
        if(dataSource.length === 0) {
          observer.complete();//通知observer數(shù)據(jù)(事件)全部發(fā)送完畢
          clearInterval(schedulerId);
          schedulerId = undefined;
        } else {
          observer.next(dataSource.shift());//把數(shù)據(jù)(事件)傳遞給observer
        }
      }, INTERVAL);
      
      return {//返回一個對象,我們可以稱之為subscription梨水,包含一個取消訂閱的函數(shù)
        unsubscribe: () => {//取消訂閱拭荤,將不再發(fā)送數(shù)據(jù)(事件)給observer
          if(schedulerId) {
            clearInterval(schedulerId);
          }
        }
      };
    }
  }
};

來看看如何使用:

let subscription = observable([1, 2, 3]).subscribe({//傳遞給subscribe函數(shù)observer對象
  next: console.log,//包含next函數(shù)
  complete: () => console.log('事件全部發(fā)送完畢')//包含complete函數(shù)
});

上面代碼的結(jié)果就是在控制臺每隔一秒打印一個數(shù)字,最后打印“事件全部發(fā)送完畢”疫诽。如下圖:

創(chuàng)建自己的observable
創(chuàng)建自己的observable

我們再看看如何在事件全部發(fā)送完畢之前取消操作舅世,如下圖:

取消訂閱操作
取消訂閱操作

因為每一秒發(fā)送一個事件,我們在2秒后調(diào)用了取消訂閱函數(shù)奇徒,因此結(jié)果只打印了1歇终,2,說明發(fā)送事件操作被取消了逼龟。

RxJS中提供了Observable的靜態(tài)函數(shù)create()來完成和上面一樣的功能评凝。

const observable = Rx.Observable.create(observer => {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.complete();
});

const subscription = observable.subscribe(console.log);

create()函數(shù)接收一個函數(shù)作為參數(shù),這個參數(shù)函數(shù)實際就是observable這個對象的subscribe函數(shù)腺律,就像上面我們自定義的subscribe函數(shù)一樣奕短。我們看到使用的時候傳給subscribe函數(shù)的并不是一個observer,而是一個函數(shù)匀钧,在RxJS內(nèi)部翎碑,subscribe函數(shù)的重載會自動為我們創(chuàng)建observer,并把console.log這個函數(shù)賦值給了next函數(shù)之斯,也就是說日杈,observer.next(1)這個操作實際就是調(diào)用的console.log(1),即在控制臺打印數(shù)字1佑刷。這里值得注意的地方就是莉擒,如果一個observable包裝的數(shù)據(jù)源是有限個數(shù)的,那么你可以調(diào)用complete()函數(shù)表明所有數(shù)據(jù)(事件)都發(fā)送完畢了瘫絮。

綜上涨冀,我們可以自定義Observable,自定義它發(fā)送數(shù)據(jù)的行為麦萤,并且可以在整個應(yīng)用程序中隨時重用它鹿鳖。

Observable是惰性求值的扁眯,不像Promise創(chuàng)建即開始運行。

最后編輯于
?著作權(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)自己被綠了对途。 大學時的朋友給我發(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)容

  • 介紹 RxJS是一個異步編程的庫蚊俺,同時它通過observable序列來實現(xiàn)基于事件的編程懈涛。它提供了一個核心的類型:...
    泓滎閱讀 16,590評論 0 12
  • 我從去年開始使用 RxJava ,到現(xiàn)在一年多了泳猬。今年加入了 Flipboard 后批钠,看到 Flipboard 的...
    Jason_andy閱讀 5,462評論 7 62
  • 前言我從去年開始使用 RxJava ,到現(xiàn)在一年多了得封。今年加入了 Flipboard 后埋心,看到 Flipboard...
    占導zqq閱讀 9,159評論 6 151
  • 村子里的傻瓜 地主家的傻兒子 thank you my bro(sister). if you were not ...
    PURE_White2閱讀 252評論 0 0
  • 活在當下 前幾天不知道想什么事情來著,突然悟到這些: 我們?yōu)槭裁磿心敲炊嗪蠡诿ι希敲炊鄵鷳n踩窖?因為我們從來沒有活在當...
    玄月之佑閱讀 430評論 0 3