搜尋
首頁web前端js教程淺析Angular中的可觀察物件、觀察者和RxJS操作符

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

淺析Angular中的可觀察物件、觀察者和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(&#39;Finished sequence&#39;); }
});
運行結果如下:


淺析Angular中的可觀察物件、觀察者和RxJS操作符

#上面一個範例示範如何自訂訂閱函數,那麼既然可以自訂訂閱者函數,我們就可以

將非同步程式碼封裝進可觀察物件的訂閱者函數中,待非同步程式碼執行完再發送資料。如下:

import { Observable } from &#39;rxjs&#39;
// 异步函数
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#multicasting

RxJS運算子

我們可以使用一系列的

RxJS操作符,在這些訊息被接收方接收之前,對它們進行一系列的處理、轉換,因為這些操作符都是純函數。

import { of } from &#39;rxjs&#39;;
import { map } from &#39;rxjs/operators&#39;;
// 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 &#39;rxjs&#39;

// 创建可观察对象,并传入订阅者函数
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 &#39;rxjs&#39;

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(&#39;抛出错误&#39;);
        }
    }),
    // 3、此处捕获错误并处理错误,对外发送数据 0
    catchError((err) => {
        console.log(err)
        return of(0)
    })
)
.subscribe(
    data => console.log(data),
    // 4、由于上面抛出的错误被 catchError 操作符处理(重新发送数据)了,所以这里能顺利订阅到数据而不报错
    err => console.log(&#39;接受不到数据:&#39;, err)
)

最後的運行結果如下:

淺析Angular中的可觀察物件、觀察者和RxJS操作符

#更多程式相關知識,請造訪:

程式設計影片! !

以上是淺析Angular中的可觀察物件、觀察者和RxJS操作符的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:csdn。如有侵權,請聯絡admin@php.cn刪除
超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

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

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

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

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

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

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

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

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

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

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

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

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

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

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MantisBT

MantisBT

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SecLists

SecLists

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