30 天精通 RxJS (06) - 代碼升級V6

06篇主要講的是 creation operator枷畏。

原文參考鏈接 http://www.reibang.com/p/4ef56f1f5b0f

  • of 操作符

import React, { useState, useEffect } from 'react';
import { of } from 'rxjs';

function App() {
  useEffect(() => {
    console.log('rx.js');
    of('Jerry','Anna').subscribe(v=>console.log(v));
  }, [])

  return (
    <div className="App">
      <h1>Rx.Js</h1>
    </div>
  );
}

export default App;

  • from 操作符

function App() {
  useEffect(() => {
    console.log('rx.js');
    from(['Jerry','Anna','test']).subscribe(v=>console.log(v));
  }, [])

  return (
    <div className="App">
      <h1>Rx.Js</h1>
    </div>
  );
}

from和of的區(qū)別有點類似于call和apply的區(qū)別

from接收字符串作為參數(shù)

function App() {
  useEffect(() => {
    console.log('rx.js');
    from('Jerry').subscribe(v=>console.log(v));
  }, [])

  return (
    <div className="App">
      <h1>Rx.Js</h1>
    </div>
  );
}

from接收Promise作為參數(shù)

function App() {
  useEffect(() => {
    console.log('rx.js');
    from(new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('hello, RxJS');
      }, 1000);
    })).subscribe(v => console.log(v));
  }, [])

RxJS 當(dāng)前的版本是6.5.3渴肉。fromPromise操作符沒有在RxJS官網(wǎng)找到批狐,應(yīng)該已經(jīng)被移除华弓。

  • fromEvent 操作符

function App() {
  useEffect(() => {
    console.log('rx.js');
    fromEvent(document.body,'click')
    .subscribe(v => console.log(v));
  }, [])

  return (
    <div className="App">
      <h1>Rx.Js</h1>
    </div>
  );
}

chrome控制臺輸出結(jié)果為


image.png
  • fromEventPattern 操作符

傳入注冊監(jiān)聽及移除監(jiān)聽兩種方法的定義

import React, { useState, useEffect } from 'react';
import { fromEventPattern } from 'rxjs';

class Producer {
  constructor() {
    this.listeners = [];
  }
  addListener(listener) {
    if (typeof listener === 'function') {
      this.listeners.push(listener)
    } else {
      throw new Error('listener 必須是 function')
    }
  }
  removeListener(listener) {
    this.listeners.splice(this.listeners.indexOf(listener), 1)
  }
  notify(message) {
    this.listeners.forEach(listener => {
      listener(message);
    })
  }
}

function App() {
  useEffect(() => {
    console.log('rx.js');
    const egghead = new Producer();
    fromEventPattern(
      (handler) => egghead.addListener(handler),
      (handler) => egghead.removeListener(handler)
    ).subscribe(v => console.log(v));
    egghead.notify('Hello! Can you hear me?');
  }, [])

  return (
    <div className="App">
      <h1>Rx.Js</h1>
    </div>
  );
}

export default App;

  • Empty 操作符

//直接輸出complete
useEffect(() => {
    console.log('rx.js');
    empty().subscribe(v => console.log(v), e => console.log(e), () => console.log('complete'));
  }, [])
  • Never 操作符

useEffect(() => {
    console.log('rx.js');
    never().subscribe(v => console.log(v), e => console.log(e), () => console.log('complete'));
  }, [])
  • throwError 操作符

原文叫throw操作符考廉,目前已經(jīng)改為throwError操作符

useEffect(() => {
    console.log('rx.js');
    throwError('error了').subscribe(v => console.log(v), e => console.error(e), () => console.log('complete'));
  }, [])
  • Interval 操作符

只有一個參數(shù),表示間隔

useEffect(() => {
    console.log('rx.js');
    interval(1000).subscribe(v => console.log(v), e => console.error(e), () => console.log('complete'));
  }, [])
  • timer 操作符

兩個參數(shù),第一個為第一次的等待毫秒,第二個參數(shù)為后面的間隔

  //第一個1會等1秒發(fā)出捷雕,后面每隔2秒發(fā)出一個遞增的值
  //如果只傳一個參數(shù),只會發(fā)出一次 1 ,然后就complete了
useEffect(() => {
    console.log('rx.js');
    timer(1000,2000).subscribe(v => console.log(v), e => console.error(e), () => console.log('complete'));
  }, [])

取消訂閱

useEffect(() => {
    console.log('rx.js');
    const subscription = interval(1000).subscribe(v => console.log(v,typeof v), e => console.error(e), () => console.log('complete'));
    setTimeout(()=>{
      subscription.unsubscribe();
    },7000);
  }, [])

下面是個自己寫的小demo渤弛,檢測10秒鐘沒有鼠標(biāo)點擊她肯,重定向到其他頁面

useEffect(() => {
    console.log('rx.js');
    interval(1000).pipe(takeUntil(fromEvent(document.body, 'click')), repeat())
      .subscribe(v => v === 10 && window.location.href='http://***', e => console.error(e), () => { console.log('complete') });
  }, [])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肄梨,隨后出現(xiàn)的幾起案子蓖租,更是在濱河造成了極大的恐慌甜害,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该肴,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機立哑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镊叁,你說我怎么就攤上這事』奁” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵卧土,是天一觀的道長。 經(jīng)常有香客問我尤莺,道長生棍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮晴音,結(jié)果婚禮上缔杉,老公的妹妹穿的比我還像新娘。我一直安慰自己或详,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布觉啊。 她就那樣靜靜地躺著,像睡著了一般杠人。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗡善,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天学歧,我揣著相機與錄音,去河邊找鬼枝笨。 笑死,一個胖子當(dāng)著我的面吹牛横浑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洒缀,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欺冀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隐轩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砰奕,失蹤者是張志新(化名)和其女友劉穎蛛芥,沒想到半個月后军援,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡涯竟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年空厌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘲更。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖篓冲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壹将,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布诽俯,位于F島的核電站承粤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辛臊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一缰盏、第九天 我趴在偏房一處隱蔽的房頂上張望涌萤。 院中可真熱鬧,春花似錦负溪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侍咱。三九已至,卻和暖如春楔脯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昧廷。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留木柬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓恶复,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寂玲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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