gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

淺析Angular中的可觀察對象、觀察者和RxJS操作符

本篇文章帶大家了解Angular中的可觀察對象(Observable)、觀察者(observer)和RxJS操作符,希望對大家有所幫助!

淺析Angular中的可觀察對象、觀察者和RxJS操作符

Observable(可觀察對象)

Observable(可觀察對象),是RxJS庫里面的一個對象,可以用來處理異步事件,例如HTTP請求(實際上,在Angular中,所有的HTTP請求返回的都是Observable)。【相關(guān)教程推薦:《angular教程》】

或許,你以前接觸過一個叫promise的東西,它們本質(zhì)上面是相同的:都是生產(chǎn)者主動向消費者“push”產(chǎn)品,而消費者是被動接收的,但是他們兩者還是有很大區(qū)別的:Observable可以發(fā)送任意多值,并且,在被訂閱之前,它是不會執(zhí)行的!這是promise不具備的特點。

  • Observable用于在發(fā)送方和接收方之間傳輸消息,你可以將這些消息看成是流
  • 在創(chuàng)建Observable對象時,需要傳入一個函數(shù)作為構(gòu)造函數(shù)的參數(shù),這個函數(shù)叫訂閱者函數(shù),這個函數(shù)也就是生產(chǎn)者向消費者推送消息的地方
  • 在被消費者subscribe(訂閱)之前,訂閱者函數(shù)不會被執(zhí)行,直到subscribe()函數(shù)被調(diào)用,該函數(shù)返回一個subscription對象,里面有一個unsubscribe()函數(shù),消費者可以隨時拒絕消息的接收!
  • subscribe()函數(shù)接收一個observer(觀察者)對象作為入?yún)?/li>
  • 消息的發(fā)送可以是同步的,也可以是異步的

observer(觀察者)

有了可觀察對象(發(fā)送方),就需要一個觀察者(接收方)來觀察可觀察對象,觀察者要實現(xiàn)observer接口,它是一個對象,其中包含三個屬性,它們都是函數(shù),如下:

通知類型 說明
next 必要。以接收的值作為入?yún)ⅲ谡G闆r下執(zhí)行。可能執(zhí)行零次或多次。
error 可選。出錯的情況下執(zhí)行。錯誤會中斷這個可觀察對象實例的執(zhí)行過程。
complete 可選。傳輸完成的情況下執(zhí)行。

訂閱

只有當有人訂閱 Observable 的實例時,它才會開始發(fā)布值。 訂閱時要先調(diào)用可觀察對象的 subscribe() 方法,并把一個觀察者對象傳給它,用來接收通知。如下:

為了展示訂閱的原理,需要先創(chuàng)建新的可觀察對象。它有一個構(gòu)造函數(shù)可以用來創(chuàng)建新實例,但是為了更簡明,也可以使用 Observable 上定義的一些靜態(tài)方法來創(chuàng)建一些常用的簡單可觀察對象:

  • of(...items) :返回一個 Observable 實例,它用同步的方式把參數(shù)中提供的這些值一個一個發(fā)送出來。
  • from(iterable) : 把它的參數(shù)轉(zhuǎn)換成一個 Observable 實例。 該方法通常用于把一個數(shù)組轉(zhuǎn)換成一個(發(fā)送多個值的)可觀察對象。
import { of } from "rxjs"; // 1、通過 of() 方法返回一個可觀察對象,并準備將1,2,3三個數(shù)據(jù)發(fā)送出去 const observable = of(1, 2, 3);	 // 2、實現(xiàn) observer 接口,觀察者 const observer = {	 	next: (num: number) => console.log(num), 	error: (err: Error) => console.error('Observer got an error: ' + err),   	complete: () => console.log('Observer got a complete notification'),  } // 3、訂閱。調(diào)用可觀察對象的 subscribe() 方法訂閱,subscribe() 方法中傳入的對象就是一個觀察者 observable.subscribe(observer);

運行結(jié)果如下:

淺析Angular中的可觀察對象、觀察者和RxJS操作符
上面訂閱的寫法可以直接改為如下:參數(shù)不是對象

observable.subscribe(   num => console.log(num),   err => console.error('Observer got an error: ' + err),   () => console.log('Observer got a complete notification') );

訂閱者函數(shù)

在上面的例子中使用的是of()方法來創(chuàng)建可觀察對象,這節(jié)使用構(gòu)造函數(shù)創(chuàng)建可觀察對象。

Observable 構(gòu)造函數(shù)可以創(chuàng)建任何類型的可觀察流。 當執(zhí)行可觀察對象的 subscribe() 方法時,這個構(gòu)造函數(shù)就會把它接收到的參數(shù)作為訂閱函數(shù)來運行。 訂閱函數(shù)會接收一個 Observer 對象,并把值發(fā)布給觀察者的 next()方法。

// 1、自定義訂閱者函數(shù) function sequenceSubscriber(observer: Observer<number>) {   observer.next(1);	// 發(fā)送數(shù)據(jù)   observer.next(2);	// 發(fā)送數(shù)據(jù)   observer.next(3);	// 發(fā)送數(shù)據(jù)   observer.complete();   return {unsubscribe() {}}; }  // 2、通過構(gòu)造函數(shù)創(chuàng)建一個新的可觀察對象,參數(shù)就是一個訂閱者函數(shù) const sequence = new Observable(sequenceSubscriber);  // 3、訂閱 sequence.subscribe({   next(num) { console.log(num); },	// 接受數(shù)據(jù)   complete() { console.log('Finished sequence'); } });

運行結(jié)果如下:

淺析Angular中的可觀察對象、觀察者和RxJS操作符

上面一個例子演示了如何自定義訂閱函數(shù),那么既然可以自定義訂閱者函數(shù),我們就可以將異步代碼封裝進可觀察對象的訂閱者函數(shù)中,待異步代碼執(zhí)行完再發(fā)送數(shù)據(jù)。如下:

import { Observable } from 'rxjs' // 異步函數(shù) function fn(num) {     return new Promise((reslove, reject) => {         setTimeout(() => {             num++             reslove(num)         }, 1000)     }) } // 創(chuàng)建可觀察對象,并傳入訂閱者函數(shù) const observable = new Observable((x) => {     let num = 1     fn(num).then(     	res => x.next(res)	// 異步代碼執(zhí)行完成,發(fā)送數(shù)據(jù)     )  }) // 訂閱,接收數(shù)據(jù),可以改為鏈式調(diào)用 observable.subscribe(data => console.log(data))	// 2

多播

https://angular.cn/guide/observables#multicasting

RxJS操作符

我們可以使用一系列的RxJS操作符,在這些消息被接收方接收之前,對它們進行一系列的處理、轉(zhuǎn)換,因為這些操作符都是純函數(shù)。

import { of } from 'rxjs'; import { map } from 'rxjs/operators'; // 1、創(chuàng)建可觀察對象,并發(fā)送數(shù)據(jù) const nums = of(1, 2, 3); // 2、創(chuàng)建函數(shù)以接受可觀察對象 const squareValues = map((val: number) => val * val); const squaredNums = squareValues(nums);  squaredNums.subscribe(x => console.log(x));

上面的方式我看不懂且難以接受,一般常用下面這種,使用pipe把多個操作符鏈接起來

import { map, Observable, filter } from 'rxjs'  // 創(chuàng)建可觀察對象,并傳入訂閱者函數(shù) const observable = new Observable((x) => {     x.next(1)     x.next(2)     x.next(3)     x.next(4) }).pipe(     map(value => value*100),		// 操作符     filter(value => value == 200)	// 操作符 ) .subscribe(data => console.log(data))	// 200

錯誤處理

RxJS 還提供了catchError 操作符,它允許你在管道中處理已知錯誤。
假設(shè)你有一個可觀察對象,它發(fā)起 API 請求,然后對服務(wù)器返回的響應(yīng)進行映射。如果服務(wù)器返回了錯誤或值不存在,就會生成一個錯誤。如果你捕獲這個錯誤并提供了一個默認值,流就會繼續(xù)處理這些值,而不會報錯。如下:

import { map, Observable, filter, catchError, of } from 'rxjs'  const observable = new Observable((x) => {         x.next(1)	// 發(fā)送數(shù)據(jù) 1 和 2         x.next(2) }).pipe(     map(value => {         if (value === 1) {	// 1、當發(fā)送的數(shù)據(jù)為 1 時,將其乘以 100             return value*100         } else {	// 2、否則拋出錯誤             throw new Error('拋出錯誤');         }     }),     // 3、此處捕獲錯誤并處理錯誤,對外發(fā)送數(shù)據(jù) 0     catchError((err) => {         console.log(err)         return of(0)     }) ) .subscribe(     data => console.log(data),     // 4、由于上面拋出的錯誤被 catchError 操作符處理(重新發(fā)送數(shù)據(jù))了,所以這里能順利訂閱到數(shù)據(jù)而不報錯     err => console.log('接受不到數(shù)據(jù):', err) )

最后的運行結(jié)果如下:

淺析Angular中的可觀察對象、觀察者和RxJS操作符

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
免费一级特黄特色毛片久久看| 99999精品| 大桥未久一区二区三区| 免费裸体美女网站| 久草资源站在线观看| 你懂的av在线| 苍井空浴缸大战猛男120分钟| 亚洲精品天堂成人片av在线播放 | 9l视频自拍9l视频自拍| 北条麻妃亚洲一区| 污污网站在线观看视频| 中文字幕亚洲乱码| 人人干人人干人人| 永久免费的av网站| 日韩网址在线观看| 国产一线二线三线在线观看| 漂亮人妻被中出中文字幕| 玩弄中年熟妇正在播放| 久艹在线免费观看| a级网站在线观看| 超碰在线免费观看97| 国产欧美综合一区| 亚洲五月激情网| 三级av免费看| 大陆极品少妇内射aaaaaa| 99热亚洲精品| 能在线观看的av| 国产天堂在线播放| 57pao国产成永久免费视频| 国产成人综合一区| 欧美三级理论片| 在线播放免费视频| 三级黄色片播放| 大陆av在线播放| 成人观看免费完整观看| 婷婷激情5月天| 超碰人人爱人人| 1024av视频| 看看黄色一级片| 奇米777四色影视在线看| 欧美日本视频在线观看| 中文字幕 欧美日韩| 免费观看亚洲视频| 日本成人黄色网| 4444在线观看| 高清一区在线观看| 国产在线播放观看| 一级黄色片在线免费观看| 国产原创中文在线观看| 在线视频一二区| 成人三级视频在线播放| 欧美xxxx吸乳| 无码人妻丰满熟妇区五十路百度| 亚洲在线观看网站| 免费在线观看毛片网站| 你懂的av在线| 久久艹国产精品| 污免费在线观看| 国产精品久久久毛片| 国产成人无码a区在线观看视频| 一起操在线视频| 男人亚洲天堂网| 欧美在线一区视频| 日韩欧美视频免费在线观看| 91pony九色| 精品日韩久久久| 日韩在线xxx| 91成人在线观看喷潮教学| 精品少妇人妻av一区二区| 亚洲这里只有精品| 九九热在线免费| 男人揉女人奶房视频60分| 久久99中文字幕| 日本国产中文字幕| 成年丰满熟妇午夜免费视频| 日本老太婆做爰视频| 三年中文高清在线观看第6集| 黄色在线视频网| 中文字幕天天干| 一级黄色特级片| 日本中文字幕影院| 国产福利片一区二区| 四虎4hu永久免费入口| 国产资源第一页| 国产va亚洲va在线va| 91成人在线观看喷潮教学| 毛片在线视频播放| 久久午夜夜伦鲁鲁一区二区| 另类小说第一页| 天堂av2020| av片在线免费| www黄色av| 日韩av一卡二卡三卡| 日本不卡一区二区三区四区| 影音先锋成人资源网站| 成年人网站国产| 久草在在线视频| 超碰在线超碰在线| 国产www免费| 在线免费观看av的网站| 乱子伦一区二区| 美脚丝袜脚交一区二区| 久久久久狠狠高潮亚洲精品| 亚洲18在线看污www麻豆| 女女百合国产免费网站| 欧美日韩激情视频在线观看| 中文字幕天天干| 黄色a级片免费看| 日韩一级片播放| 成人在线国产视频| 艹b视频在线观看| www.射射射| 天天成人综合网| 99免费视频观看| 69sex久久精品国产麻豆| 国产一区视频免费观看| 久久人妻无码一区二区| a在线观看免费视频| 草b视频在线观看| 国产毛片久久久久久| av免费在线播放网站| 免费高清一区二区三区| 亚洲天堂av一区二区| 东京热加勒比无码少妇| 看一级黄色录像| 亚洲36d大奶网| 日本成年人网址| 国产欧美日韩小视频| 91精品一区二区三区四区| 天天操天天干天天做| 无码人妻精品一区二区三区66| 国产亚洲精品久久久久久久| 色呦色呦色精品| 午夜免费精品视频| 哪个网站能看毛片| 日韩在线视频在线观看| 日本国产在线播放| 91九色丨porny丨国产jk| 91精品国产毛片武则天| 免费看av软件| 成人手机视频在线| 偷拍盗摄高潮叫床对白清晰| 一级淫片在线观看| 激情在线观看视频| 午夜视频在线观| 欧美性视频在线播放| 黄色一级片av| 国产91porn| 免费超爽大片黄| 国模吧无码一区二区三区| 日日橹狠狠爱欧美超碰| 国产二区视频在线播放| 国产一级不卡毛片| 污污动漫在线观看| 中文字幕在线综合| 免费成人深夜夜行网站视频| 久久久久久久香蕉| 一卡二卡三卡视频| 大香煮伊手机一区| 欧美又黄又嫩大片a级| 欧美激情亚洲天堂| 能在线观看的av| 三日本三级少妇三级99| 国产 欧美 日本| 成人精品视频一区二区| 中文字幕日韩综合| 久草免费福利在线| 天天干在线影院| 国产精品视频一二三四区| 国产91在线视频观看| 在线能看的av网站| 欧美 日韩 国产 高清| 不卡的在线视频| 大伊香蕉精品视频在线| 一本色道久久亚洲综合精品蜜桃 | 人妻少妇精品久久| chinese少妇国语对白| 超级碰在线观看| 黄色国产小视频| 激情五月婷婷六月| 午夜免费看视频| 日本在线xxx| 亚洲欧美日韩网站| 久久精品网站视频| 精品国产一区二区三区无码| 日本黄大片一区二区三区| 欧美乱大交xxxxx潮喷l头像| 欧美激情第3页| 国产成人精品视频免费看| 黄瓜视频免费观看在线观看www| av网址在线观看免费| 老子影院午夜伦不卡大全| 尤物国产在线观看| 成人性视频欧美一区二区三区| 午夜久久久久久久久久久| 超碰超碰在线观看| 538在线视频观看| 国产极品尤物在线| 国产九九九九九| 青草视频在线观看视频|