本篇文章帶大家了解Angular中的可觀察物件(Observable)、觀察者(observer)和RxJS操作符,希望對大家有幫助!
Observable(可觀察對象)
#Observable
(可觀察對象),是RxJS
##庫裡面的一個對象,可以用來處理非同步事件,例如HTTP請求(實際上,在Angular中,所有的HTTP請求返回的都是Observable)。 【相關教學推薦:《angular教學》】
#或許,你以前接觸過一個叫promise
的東西,它們本質上面是相同的:都是生產者主動向消費者「push」產品,而消費者是被動接收的,但是他們兩者還是有很大區別的:Observable
可以發送任意多值,並且,在被訂閱之前,它是不會執行的!這是promise
不具備的特質。
-
Observable
用於在發送方和接收方之間傳輸訊息,你可以將這些訊息看成是流 - 在創建
Observable
物件時,需要傳入一個函式作為建構函式的參數,而這個函式叫訂閱者函式,這個函式也就是生產者向消費者推播訊息的地方 - 在被消費者
subscribe
(訂閱)之前,訂閱者函數不會被執行,直到subscribe()
函數被調用,該函數返回一個subscription
對象,裡面有一個unsubscribe()
函數,消費者可以隨時拒絕訊息的接收! -
subscribe()
函數接收一個observer(觀察者)
物件作為入參 - 訊息的傳送可以是同步的,也可以是非同步的
observer(觀察者)
有了可觀察物件(發送方)
,就需要一個觀察者(接收者)
來觀察可觀察對象,觀察者要實現observer
接口,它是一個對象,其中包含三個屬性,它們都是函數,如下:
通知類型 | 說明 |
---|---|
next | #必要。以接收的值作為入參,在正常情況下執行。可能執行零次或多次。 |
error | 可選。出錯的情況下執行。錯誤會中斷這個可觀察物件實例的執行過程。 |
complete | 可選。傳輸完成的情況下執行。 |
訂閱
只有當有人訂閱 Observable
的實例時,它才會開始發佈值。訂閱時要先呼叫可觀察物件的 subscribe()
方法,並把一個觀察者物件傳給它,用來接收通知。如下:
運行結果如下:為了展示訂閱的原理,需要先建立新的可觀察物件。它有一個建構函式可以用來建立新實例,但是為了更簡明,也可以使用
Observable
上定義的一些靜態方法來建立一些常用的簡單可觀察物件:
- ##of(...items)
:傳回一個
Observable實例,它用同步的方式把參數中提供的這些值
一個一個送到。
- from(iterable)
: 把它的參數轉換成一個
Observable實例。此方法通常用來把一個陣列轉換成一個(發送多個值的)可觀察物件。
import { of } from "rxjs"; // 1、通过 of() 方法返回一个可观察对象,并准备将1,2,3三个数据发送出去 const observable = of(1, 2, 3); // 2、实现 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、订阅。调用可观察对象的 subscribe() 方法订阅,subscribe() 方法中传入的对象就是一个观察者 observable.subscribe(observer);
# 上面訂閱的寫法可以直接改為如下:參數不是物件
observable.subscribe( num => console.log(num), err => console.error('Observer got an error: ' + err), () => console.log('Observer got a complete notification') );訂閱者函數在上面的範例中使用的是
of()方法來建立可觀察對象,這節使用建構函式建立可觀察對象。
運行結果如下:Observable
建構子可以建立任何類型的可觀察流。當執行可觀察物件的
subscribe()方法時,這個建構函式就會把它接收到的參數當作
訂閱函式來運作。訂閱函數會接收一個
Observer對象,並且把值發佈給觀察者的
next()方法。
// 1、自定义订阅者函数 function sequenceSubscriber(observer: Observer<number>) { observer.next(1); // 发送数据 observer.next(2); // 发送数据 observer.next(3); // 发送数据 observer.complete(); return {unsubscribe() {}}; } // 2、通过构造函数创建一个新的可观察对象,参数就是一个订阅者函数 const sequence = new Observable(sequenceSubscriber); // 3、订阅 sequence.subscribe({ next(num) { console.log(num); }, // 接受数据 complete() { console.log('Finished sequence'); } });
將非同步程式碼封裝進可觀察物件的訂閱者函數中,待非同步程式碼執行完再發送資料。如下:
import { Observable } from 'rxjs' // 异步函数 function fn(num) { return new Promise((reslove, reject) => { setTimeout(() => { num++ reslove(num) }, 1000) }) } // 创建可观察对象,并传入订阅者函数 const observable = new Observable((x) => { let num = 1 fn(num).then( res => x.next(res) // 异步代码执行完成,发送数据 ) }) // 订阅,接收数据,可以改为链式调用 observable.subscribe(data => console.log(data)) // 2多播
https://angular.cn/guide/observables#multicastingRxJS運算子我們可以使用一系列的
RxJS操作符,在這些訊息被接收方接收之前,對它們進行一系列的處理、轉換,因為這些操作符都是純函數。
import { of } from 'rxjs'; import { map } from 'rxjs/operators'; // 1、创建可观察对象,并发送数据 const nums = of(1, 2, 3); // 2、创建函数以接受可观察对象 const squareValues = map((val: number) => val * val); const squaredNums = squareValues(nums); squaredNums.subscribe(x => console.log(x));上面的方式我看不懂且難以接受,一般常用下面這種,使用
pipe把多個運算子連結起來
import { map, Observable, filter } from 'rxjs' // 创建可观察对象,并传入订阅者函数 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 操作符,它允許你在管道中處理已知錯誤。
假設你有一個可觀察對象,它會發起 API 請求,然後對伺服器返回的回應進行映射。如果伺服器回傳了錯誤或值不存在,就會產生一個錯誤。如果你捕獲這個錯誤並提供了一個預設值,流就會繼續處理這些值,而不會報錯。如下:
import { map, Observable, filter, catchError, of } from 'rxjs' const observable = new Observable((x) => { x.next(1) // 发送数据 1 和 2 x.next(2) }).pipe( map(value => { if (value === 1) { // 1、当发送的数据为 1 时,将其乘以 100 return value*100 } else { // 2、否则抛出错误 throw new Error('抛出错误'); } }), // 3、此处捕获错误并处理错误,对外发送数据 0 catchError((err) => { console.log(err) return of(0) }) ) .subscribe( data => console.log(data), // 4、由于上面抛出的错误被 catchError 操作符处理(重新发送数据)了,所以这里能顺利订阅到数据而不报错 err => console.log('接受不到数据:', err) )最後的運行結果如下:
程式設計影片! !
以上是淺析Angular中的可觀察物件、觀察者和RxJS操作符的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。