摘要:它有三個(gè)方法,用來(lái)通知下一個(gè)值是什么方法在上產(chǎn)生錯(cuò)誤時(shí)通知觀察者,方法用來(lái)通知觀察者當(dāng)前流上的值已經(jīng)發(fā)射完畢。除此之外在我們不需要訂閱時(shí),觀察者還應(yīng)該能夠安全的退出。
上次說(shuō)了響應(yīng)式中使用的設(shè)計(jì)模式,今天我們主要來(lái)看rxjs中實(shí)現(xiàn)響應(yīng)式的三大件,Observable, subject 和 Subscription;
Observable--可觀測(cè)序列在第一節(jié)中介紹過(guò) push 類型的系統(tǒng)和 pull 類型的系統(tǒng),它們都可以產(chǎn)生值:
產(chǎn)生單個(gè)值 | 產(chǎn)生多個(gè)值 | |
---|---|---|
pull | function | iterator |
push | promise | ? |
在es6中promise已經(jīng)被原生支持了,但是并沒(méi)有一種原生的方法來(lái)實(shí)現(xiàn)push系統(tǒng)中產(chǎn)生多個(gè)值,于是Observable添補(bǔ)了這一空白。
// 創(chuàng)建一個(gè)observable const observable = Rx.Observable.create(function(observer) { observer.next(1); observer.next(2); observer.next(3); setTimeout(() => { observer.next(4); observer.complete(); },1000); }); console.log("just before subscribe"); // 通過(guò) subscribe 方法來(lái)獲取 observable 上的值 observable.subscribe({ next: x => console.log("got value " + x), error: err => console.error("something wrong occurred: " + err), complete: () => console.log("done"), }); console.log("just after subscribe);
這段代碼執(zhí)行后將會(huì)得到如下結(jié)果:
just before subscribe got value 1 got value 2 got value 3 just after subscribe got value 4 done
從結(jié)果可以看出通過(guò)一次訂閱我們就可以拿到一個(gè)observable上所有推送過(guò)來(lái)的值,另外請(qǐng)注意看輸出的順序,1,2,3在 after之前,而4在after之后,這說(shuō)明observable發(fā)出的值不一定都是異步或都是同步,什么時(shí)間可以取到值完全取決于以哪種方式發(fā)出。
上面代碼中還有幾個(gè)地方可能需要解釋下:
create:它實(shí)際上是Observable 的構(gòu)造函數(shù)的別名,換句話說(shuō)可以用 new Rx.Observable(...) 取代。
observer:觀察者,顧名思義,這個(gè)東西就是我們上一節(jié)講過(guò)的觀察者模式中的觀察者,這里它是由rxjs負(fù)責(zé)給我們傳遞進(jìn)來(lái),實(shí)際上它就是我們?cè)趕ubscribe()中傳入的那個(gè)對(duì)象。它有三個(gè)方法,next用來(lái)通知下一個(gè)值是什么;error 方法在 observable 上產(chǎn)生錯(cuò)誤時(shí)通知觀察者,complete方法用來(lái)通知觀察者當(dāng)前流上的值已經(jīng)發(fā)射完畢。
subscribe: 它就是Observable類提供的方法,用來(lái)獲取可觀測(cè)序列上發(fā)出的值,接收一觀察者作為參數(shù)。當(dāng)然,上面的代碼可以寫(xiě)成:
observable.subscribe(
x => console.log("got value " + x), err => console.error("something wrong occurred: " + err), () => console.log("done"),
);
第一個(gè)參數(shù)處理next通知,第二個(gè)參數(shù)處理error通知,第三個(gè)參數(shù)處理complete通知,我們還可以選擇是否處理 error 通知和 complete通知,也就是說(shuō)第二,三個(gè)參數(shù)還可以省略。當(dāng)然rxjs內(nèi)部還會(huì)把我們傳入的參數(shù)處理成那個(gè)觀察者對(duì)象。
以上代碼中,我們實(shí)際已完成了observable 的創(chuàng)建(通過(guò)create),訂閱(通過(guò)subscribe),執(zhí)行(調(diào)用 next 和 complete)過(guò)程。除此之外在我們不需要訂閱時(shí),觀察者還應(yīng)該能夠安全的退出。
subscription這就是我們?nèi)∠嗛啎r(shí)的所要用到的東西,上面的訂閱代碼完整的寫(xiě)法應(yīng)該是:
const subscription = observable.subscribe({...});
它是我們訂閱一個(gè)observable后獲取到的,也就是subscribe方法的返回值,它上面有3個(gè)重要的方法。
unsubscribe 顧名思義,取消訂閱。
add 添加另外一個(gè)subscription。在有多個(gè)subscription時(shí)我們可以通過(guò)這個(gè)方法將它們都鏈接起來(lái),這樣取消時(shí)只需要取消一個(gè),而不必調(diào)用每個(gè) subscription 的unsubscribe 方法。
remove 當(dāng)然能添加必然可以移除。從當(dāng)前的 subscription 上移除另一個(gè) subscription
// 取消之前的訂閱
subscription.unsubscribe();
//重新訂閱之前我們創(chuàng)建的observable,取消訂閱時(shí)逐個(gè)調(diào)用它們的unsubscribe方法
const subscription1 = observable.subscribe({...});
const subscription2 = observable.subscribe({...});
const subscription3 = observable.subscribe({...});
//重新訂閱之前我們創(chuàng)建的observable,取消訂閱時(shí)只調(diào)用一次unsubscribe
const sub$$ = observable.subscribe({...})
.add(observable.subscribe({...})) .add(observable.subscribe({...}));subject
它即是observable,也是observer,所以它即可以被 subscribe 又可以通過(guò)next,error,complete發(fā)射值。下面的例子中,我們給 Subject 添加了兩個(gè)觀察者,然后給它添加一些值:
const 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);
執(zhí)行后的輸出:
observerA: 1 observerB: 1 observerA: 2 observerB: 2 由于 Subject 也是一個(gè) Observer ,所以你可以把他傳遞給一個(gè) Observable 的subscribe方法: 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); // 通過(guò) Subject 來(lái)訂閱這條 Observable
執(zhí)行后輸出:
observerA: 1 observerB: 1 observerA: 2 observerB: 2 observerA: 3 observerB: 3
通過(guò)上面的方法,我們基本上就借助 Subject 把一個(gè)單播的 Observable 轉(zhuǎn)換成了多播的。這個(gè)示例僅僅是演示了一種將一個(gè)執(zhí)行上下文分享給多個(gè)觀察者的方法。
上面代碼中有一個(gè)from方法,它的作用就是來(lái)創(chuàng)建一個(gè)可觀測(cè)序列,類似于之前的create方法,但更加簡(jiǎn)潔,在rxjs中,它有個(gè)專門(mén)的名稱叫個(gè)操作符,通過(guò)各種各樣的操作符我們就可以實(shí)現(xiàn)可觀測(cè)序列的創(chuàng)建,以及對(duì)序列中的數(shù)據(jù)進(jìn)行各種各樣的轉(zhuǎn)換,可以說(shuō)使用rxjs時(shí)我們大部分的時(shí)候都在使用各種各樣的操作符。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97263.html
摘要:響應(yīng)式命令式這兩種編程風(fēng)格的思維方式是完全相反的。第二種方式是工人主動(dòng)去找工人索取生產(chǎn)手機(jī)所要的零件,然后生產(chǎn)一臺(tái)完整的手機(jī),這兩種方式就對(duì)應(yīng)的響應(yīng)式和命令式。 angular2中內(nèi)置了rxjs,雖然框架本身并沒(méi)有強(qiáng)制開(kāi)發(fā)者使用響應(yīng)式風(fēng)格來(lái)組織代碼,但是從框架開(kāi)發(fā)團(tuán)隊(duì)的角度可以看出他們必然是認(rèn)同這種編程風(fēng)格的。rxjs本質(zhì)是基于函數(shù)式編程的響應(yīng)式風(fēng)格的庫(kù),函數(shù)式相對(duì)于面向?qū)ο髞?lái)說(shuō)更加抽...
摘要:今天這篇文章主要介紹函數(shù)式編程的思想。函數(shù)式編程通過(guò)最小化變化使得代碼更易理解。在函數(shù)式編程里面,組合是一個(gè)非常非常非常重要的思想??梢钥吹胶瘮?shù)式編程在開(kāi)發(fā)中具有聲明模式。而函數(shù)式編程旨在盡可能的提高代碼的無(wú)狀態(tài)性和不變性。 最開(kāi)始接觸函數(shù)式編程的時(shí)候是在小米工作的時(shí)候,那個(gè)時(shí)候看老大以前寫(xiě)的代碼各種 compose,然后一些 ramda 的一些工具函數(shù),看著很吃力,然后極力吐槽函數(shù)式...
摘要:所以一個(gè)網(wǎng),甚至是響應(yīng)式設(shè)計(jì),在兩個(gè)平臺(tái)上都會(huì)損害您整體的。三響應(yīng)式與如果把網(wǎng)站作為一個(gè)單獨(dú)的網(wǎng)站,如果網(wǎng)站的內(nèi)容與桌面版的內(nèi)容相對(duì)缺少,導(dǎo)致用戶回到桌面端的網(wǎng)站,會(huì)記錄這種選擇,使搜索排名降低,國(guó)內(nèi)百度就不知道會(huì)怎樣。 一、為什么需要響應(yīng)式設(shè)計(jì)(responsible web design) 1. 響應(yīng)式發(fā)展背景 1、屏幕尺寸的快速變化,iphone為320x480,分辨率在未來(lái)可以...
摘要:從這個(gè)系列的第一章開(kāi)始到第五章,基于的響應(yīng)式編程的基礎(chǔ)知識(shí)基本上就介紹完了,當(dāng)然有很多知識(shí)點(diǎn)沒(méi)有提到,比如,等,不是他們不重要,而是礙于時(shí)間精力等原因沒(méi)辦法一一詳細(xì)介紹。 從這個(gè)系列的第一章開(kāi)始到第五章,基于rxjs的響應(yīng)式編程的基礎(chǔ)知識(shí)基本上就介紹完了,當(dāng)然有很多知識(shí)點(diǎn)沒(méi)有提到,比如 Scheduler, behaviorSubject,replaySubject等,不是他們不重要,...
摘要:僅在幾年以前,僅有少數(shù)的程序員知道函數(shù)式編程是什么。函數(shù)式編程是聲明性的而不是命令式的應(yīng)用狀態(tài)流經(jīng)純函數(shù)中。函數(shù)式編程是一種編程模式。在理解軟件是如何使用函數(shù)式編程構(gòu)建時(shí),理解函數(shù)組合是非常重要的一步。不可變性是函數(shù)式編程的核心概念。 函數(shù)式編程已然變成了一個(gè)javascript語(yǔ)言中一個(gè)非常熱門(mén)的話題。僅在幾年以前,僅有少數(shù)的js程序員知道函數(shù)式編程是什么。但是在過(guò)去三年中,我所見(jiàn)過(guò)...
閱讀 1200·2023-04-26 02:42
閱讀 1641·2021-11-12 10:36
閱讀 1804·2021-10-25 09:47
閱讀 1274·2021-08-18 10:22
閱讀 1815·2019-08-30 15:52
閱讀 1225·2019-08-30 10:54
閱讀 2642·2019-08-29 18:46
閱讀 3504·2019-08-26 18:27