摘要:類(lèi)似于函數(shù)聲明類(lèi)似于函數(shù)調(diào)用類(lèi)似于調(diào)用時(shí)傳入回調(diào)函數(shù)對(duì)象來(lái)執(zhí)行執(zhí)行后的返回值稱(chēng)為可以停止后續(xù)的執(zhí)行還可以合在一起一起終止多個(gè)的執(zhí)行是多個(gè)值的惰性推送集合。
Observable
Observable類(lèi)似于函數(shù)聲明
var observable = Rx.Observable.create(function subscribe(observer) { var id = setInterval(() => { observer.next("hi") }, 1000) });
subscribe類(lèi)似于函數(shù)調(diào)用(類(lèi)似于function.call),調(diào)用時(shí)傳入回調(diào)函數(shù)observer對(duì)象來(lái)執(zhí)行
observable.subscribe({next:x => console.log(x)})
執(zhí)行后的返回值稱(chēng)為Subscription,可以停止后續(xù)Observable的執(zhí)行,Subscription還可以合在一起,一起終止多個(gè)Observable的執(zhí)行
var subscription = observable.subscribe({next:x => console.log(x)}) subscription.unsubscribe()
Observable是多個(gè)值的惰性推送集合。
Observable和普通函數(shù)的區(qū)別:
普通的function會(huì)同步的返回一個(gè)值,屬于一種拉取值的操作,你可以確定這個(gè)值是存在的,而Observable可以同步或異步的返回一個(gè)或多個(gè)值,屬于推送值的操作,類(lèi)似于Promise,你并不確定這個(gè)值是否存在,也不知道何時(shí)會(huì)接收到數(shù)據(jù),但是可以通過(guò)回調(diào)函數(shù)的方式,明確當(dāng)值可用的時(shí)候做什么操作.
為什么要用Observable呢,因?yàn)樗梢酝瓿梢恍┢胀╢unction完成不了的工作,比如:
純凈性純凈性使你的代碼無(wú)需引入外部狀態(tài),更不容易出錯(cuò)。
var count = 0; var button = document.querySelector("button"); button.addEventListener("click", () => console.log(`Clicked ${++count} times`));
// 使用rxjs var button = document.querySelector("button"); Rx.Observable.fromEvent(button, "click") .scan(count => count + 1, 0) .subscribe(count => console.log(`Clicked ${count} times`));流動(dòng)性
RxJS 提供了一整套操作符來(lái)幫助你控制事件如何流經(jīng) observables ,代碼更簡(jiǎn)潔,更可讀。
var count = 0; var rate = 1000; var lastClick = Date.now() - rate; var button = document.querySelector("button"); button.addEventListener("click", () => { if (Date.now() - lastClick >= rate) { console.log(`Clicked ${++count} times`); lastClick = Date.now(); } });
var button = document.querySelector("button"); Rx.Observable.fromEvent(button, "click") .throttleTime(1000) .scan(count => count + 1, 0) .subscribe(count => console.log(`Clicked ${count} times`));Subject
Subject類(lèi)似于事件監(jiān)聽(tīng),會(huì)在內(nèi)部維護(hù)多個(gè)observer
var subject = new Rx.Subject(); subject.subscribe({ next: (v) => console.log("observerA: " + v) }); subject.subscribe({ next: (v) => console.log("observerB: " + v) });
調(diào)用Subject.next時(shí)發(fā)送事件通知,將依次執(zhí)行Subject內(nèi)部維護(hù)的全部observer
var subject = new Rx.Subject(); subject.subscribe({ next: (v) => console.log("observerA: " + v) }); subject.subscribe({ next: (v) => console.log("observerB: " + v) }); subject.next(1) subject.next(2)
在某個(gè)Observable聲明之后,進(jìn)行subscribe調(diào)用時(shí)也可以傳入Subject,這將依次執(zhí)行Subject內(nèi)部維護(hù)的全部observer
var subject = new Rx.Subject(); subject.subscribe({ next: (v) => console.log("observerA: " + v) }); subject.subscribe({ next: (v) => console.log("observerB: " + v) }); var observable = Rx.Observable.from([1, 2, 3]); observable.subscribe(subject);BehaviorSubject
BehaviorSubject是Subject的一個(gè)變體,它有一個(gè)“當(dāng)前值”的概念。當(dāng)前值是發(fā)送給消費(fèi)者的最后一個(gè)值。在new BehaviorSubject時(shí)可以初始化一個(gè)當(dāng)前值。當(dāng)有新的觀察者訂閱時(shí),會(huì)立即從 BehaviorSubject 那接收到“當(dāng)前值”。
var subject = new Rx.BehaviorSubject(0); // 0是初始的當(dāng)前值 subject.subscribe({ next: (v) => console.log("observerA: " + v) }); subject.next(1); subject.next(2); subject.subscribe({ next: (v) => console.log("observerB: " + v) }); subject.next(3);ReplaySubject
ReplaySubject類(lèi)似于BehaviorSubject,它有一個(gè)“緩沖值”的概念,可以想象成多個(gè)"當(dāng)前值"。在new ReplaySubject時(shí)可以初始化一個(gè)"緩沖值"的數(shù)量,當(dāng)有新的觀察者訂閱時(shí),會(huì)立即從 ReplaySubject 那接收到每一個(gè)“緩沖值”。
除了緩沖數(shù)量,你還可以指定 window time (以毫秒為單位)來(lái)確定多久之前的值可以記錄。
var subject = new Rx.ReplaySubject(3); // 為新的訂閱者緩沖3個(gè)值 subject.subscribe({ next: (v) => console.log("observerA: " + v) }); subject.next(1); subject.next(2); subject.next(3); subject.next(4); subject.subscribe({ next: (v) => console.log("observerB: " + v) }); subject.next(5);AsyncSubject
AsyncSubject 是另一個(gè) Subject 變體,只有當(dāng) Observable 執(zhí)行完成時(shí)(執(zhí)行 complete()),它才會(huì)將執(zhí)行的最后一個(gè)值發(fā)送給觀察者。
var subject = new Rx.AsyncSubject(); subject.subscribe({ next: (v) => console.log("observerA: " + v) }); subject.next(1); subject.next(2); subject.next(3); subject.next(4); subject.subscribe({ next: (v) => console.log("observerB: " + v) }); subject.next(5); subject.complete();總結(jié)
observable的執(zhí)行類(lèi)似函數(shù)調(diào)用,subject的執(zhí)行類(lèi)似事件監(jiān)聽(tīng).
observer是一些待執(zhí)行的函數(shù),Observable可以執(zhí)行observer,Subject也可以執(zhí)行observer,只不過(guò)是兩種不同的運(yùn)行模式,究竟用哪種視情況而定
操作符操作符就是以特定的observer來(lái)訂閱原observable,然后返回一個(gè)以特定操作結(jié)果作為next值的新的Observable
function multiplyByTen(input) { // 原observable被封裝在新的observable內(nèi)部,只有外部的observable被訂閱時(shí)才會(huì)執(zhí)行內(nèi)部的訂閱 const output = Observable.create(function subscribe(observer) { input.subscribe(val => { observer.next(val * 10) }) }) // 返回新的observable return output; } var source = Observable.create(function subscribe(observer) { observer.next(1) observer.next(2) }); multiplyByTen(source).subscribe(val => console.log(val))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97988.html
摘要:項(xiàng)目簡(jiǎn)介本次使用了和開(kāi)發(fā)了一個(gè)地址輸入框,主要實(shí)現(xiàn)的功能有限制輸入符合條件的字符并每隔兩位可以自動(dòng)添加用于分割的冒號(hào)。項(xiàng)目屏蔽了的事件處理,同時(shí)使用來(lái)手動(dòng)控制光標(biāo)。繼承于和因此同時(shí)具有和兩者的方法。后面的和都是需要利用最新的來(lái)進(jìn)行判斷的。 項(xiàng)目簡(jiǎn)介 本次使用了RxJS和react開(kāi)發(fā)了一個(gè)mac地址輸入框,主要實(shí)現(xiàn)的功能有限制輸入符合條件的字符1-9,a-f,并每隔兩位可以自動(dòng)添加用于...
摘要:技術(shù)積累經(jīng)過(guò)社區(qū)的努力學(xué)習(xí)資料還是很多的,官方中文文檔就已經(jīng)很不錯(cuò),不過(guò)我們先從天精通初步感受一下然后配合一些中文文檔來(lái)補(bǔ)充知識(shí)點(diǎn),最后再根據(jù)官方文檔來(lái)校驗(yàn)整個(gè)知識(shí)體系。資料學(xué)習(xí)操作符的時(shí)候可以對(duì)照彈珠圖的交互彈珠圖的中文版中文文檔 前言 最近準(zhǔn)備畢設(shè),技術(shù)選型的時(shí)候因?yàn)楣δ艿囊恍┬枨鬁?zhǔn)備將RxJs融入到項(xiàng)目中,考慮RxJs的時(shí)候因?yàn)橹暗募夹g(shù)棧還猶豫了一下,查了一些資料以及粗略瀏覽了...
摘要:年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會(huì)興起,哪些技術(shù)會(huì)沒(méi)落。自從谷歌提出后,就持續(xù)的獲得了業(yè)界的關(guān)注,熱度可見(jiàn)一斑。就在今年,谷歌也宣布將獲得與安卓原生應(yīng)用同等的待遇與權(quán)限。但是無(wú)論都值得關(guān)注。 1.前言 2017悄然過(guò)去,2018已經(jīng)來(lái)到。人在進(jìn)步,技術(shù)在發(fā)展。2018年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會(huì)興起,哪些技術(shù)會(huì)沒(méi)落。下面就我個(gè)人的判斷進(jìn)行一個(gè)預(yù)測(cè)判斷,希望能對(duì)大家...
摘要:年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會(huì)興起,哪些技術(shù)會(huì)沒(méi)落。自從谷歌提出后,就持續(xù)的獲得了業(yè)界的關(guān)注,熱度可見(jiàn)一斑。就在今年,谷歌也宣布將獲得與安卓原生應(yīng)用同等的待遇與權(quán)限。但是無(wú)論都值得關(guān)注。 1.前言 2017悄然過(guò)去,2018已經(jīng)來(lái)到。人在進(jìn)步,技術(shù)在發(fā)展。2018年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會(huì)興起,哪些技術(shù)會(huì)沒(méi)落。下面就我個(gè)人的判斷進(jìn)行一個(gè)預(yù)測(cè)判斷,希望能對(duì)大家...
閱讀 849·2021-11-18 10:07
閱讀 2360·2021-10-14 09:42
閱讀 5349·2021-09-22 15:45
閱讀 594·2021-09-03 10:29
閱讀 3472·2021-08-31 14:28
閱讀 1881·2019-08-30 15:56
閱讀 3046·2019-08-30 15:54
閱讀 1002·2019-08-29 11:32