RxJS 核心操作符詳細用法示例

1. Observable 詳細用法

Observable 是 RxJS 的核心概念,代表一個可觀察的數據流。

創建和訂閱 Observable

import { Observable } from "rxjs";// 1. 創建Observable
const myObservable = new Observable(subscriber => {// 發出三個值subscriber.next('第一個值');subscriber.next('第二個值');subscriber.next('第三個值');// 模擬異步操作setTimeout(() => {subscriber.next('異步值');subscriber.complete(); // 完成流}, 1000);// 可選的清理邏輯return () => {console.log('Observable被取消訂閱');};
});// 2. 訂閱Observable
const subscription = myObservable.subscribe({next: value => console.log('收到值:', value),error: err => console.error('發生錯誤:', err),complete: () => console.log('流已完成')
});// 3. 取消訂閱 (通常在組件銷毀時調用)
setTimeout(() => {subscription.unsubscribe();
}, 2000);/* 輸出順序:
收到值: 第一個值
收到值: 第二個值
收到值: 第三個值
(等待1秒)
收到值: 異步值
流已完成
(再等待1秒)
Observable被取消訂閱
*/

2. of 操作符詳細用法

of 用于創建一個會立即發出給定參數的 Observable。

基本示例

import { of } from "rxjs";// 發出固定值
of('蘋果', '香蕉', '橙子').subscribe({next: fruit => console.log('水果:', fruit),complete: () => console.log('水果列表結束')
});/* 輸出:
水果: 蘋果
水果: 香蕉
水果: 橙子
水果列表結束
*/// 發出不同類型的數據
of('字符串',123,true,{name: 'Alice'},[1, 2, 3],function hello() { return 'world'; }
).subscribe(val => console.log('收到的值:', val));// 實際應用:模擬API返回
function mockApiCall() {return of({id: 1, name: '用戶1'});
}mockApiCall().subscribe(user => {console.log('用戶數據:', user);
});

3. from 操作符詳細用法

from 可以將多種數據類型轉換為 Observable。

各種來源的轉換

import { from } from "rxjs";// 1. 從數組創建
from([10, 20, 30]).subscribe(num => console.log('數字:', num));// 2. 從Promise創建
const promise = fetch('https://api.example.com/data').then(response => response.json());from(promise).subscribe(data => {console.log('API數據:', data);
});// 3. 從字符串創建 (每個字符作為單獨的值)
from('Hello').subscribe(char => console.log(char));
// 輸出: H, e, l, l, o// 4. 從Map或Set創建
const myMap = new Map();
myMap.set('name', 'Alice');
myMap.set('age', 25);from(myMap).subscribe(entry => {console.log('Map條目:', entry);// 輸出: ['name', 'Alice'], ['age', 25]
});// 5. 實際應用:批量處理數組
const userIds = [1, 2, 3, 4];from(userIds).subscribe(id => {console.log('處理用戶ID:', id);// 這里可以調用API獲取每個用戶的詳細信息
});

4. forkJoin 操作符詳細用法

forkJoin 用于并行執行多個 Observable,等待它們全部完成。

完整示例

import { forkJoin, of, from, throwError } from "rxjs";
import { delay, catchError } from "rxjs/operators";// 模擬API函數
function getUser(id) {return of({ id, name: `用戶${id}` }).pipe(delay(1000));
}function getUserPosts(userId) {const posts = [{ id: 1, title: '帖子1' },{ id: 2, title: '帖子2' }];return of(posts).pipe(delay(1500));
}function getUserComments(userId) {return from(fetch(`https://api.example.com/users/${userId}/comments`));
}// 1. 基本用法
forkJoin([getUser(1),getUserPosts(1),getUserComments(1).pipe(catchError(error => of(`獲取評論失敗: ${error.message}`)))
]).subscribe({next: ([user, posts, comments]) => {console.log('用戶:', user);console.log('帖子:', posts);console.log('評論:', comments);},error: err => console.error('整體失敗:', err),complete: () => console.log('所有請求完成')
});// 2. 對象形式更清晰
forkJoin({user: getUser(1),posts: getUserPosts(1),comments: getUserComments(1).pipe(catchError(error => of([])) // 錯誤時返回空數組)
}).subscribe({next: result => {console.log('整合結果:', result);// 結構: { user: {...}, posts: [...], comments: [...] }}
});// 3. 錯誤處理演示
forkJoin({success: of('成功'),failure: throwError(new Error('出錯了'))
}).pipe(catchError(error => {console.log('捕獲到錯誤:', error);return of({ success: null, failure: error.message });})
).subscribe(result => {console.log('最終結果:', result);
});// 4. 實際應用:并行請求多個API
function loadDashboardData() {return forkJoin({user: getUser(1),notifications: from(fetch('/api/notifications')),settings: from(fetch('/api/settings'))});
}loadDashboardData().subscribe(data => {console.log('儀表盤數據:', data);// 更新UI...
});

綜合實戰示例

import { forkJoin, from, of } from "rxjs";
import { map, mergeMap, catchError } from "rxjs/operators";// 模擬API服務
class ApiService {static getUsers() {const users = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' }];return of(users).pipe(delay(500));}static getUserDetails(userId) {const details = {1: { age: 25, email: 'alice@example.com' },2: { age: 30, email: 'bob@example.com' }};return of(details[userId]).pipe(delay(300));}static getUserPosts(userId) {const posts = {1: [{ id: 101, title: 'Alice的第一篇帖子' }],2: [{ id: 201, title: 'Bob的帖子' }, { id: 202, title: 'Bob的另一篇帖子' }]};return of(posts[userId] || []).pipe(delay(700));}
}// 1. 獲取所有用戶及其詳細信息和帖子
ApiService.getUsers().pipe(mergeMap(users => {// 為每個用戶創建請求數組const userRequests = users.map(user => forkJoin({details: ApiService.getUserDetails(user.id),posts: ApiService.getUserPosts(user.id)}).pipe(map(data => ({ ...user, ...data }))));// 并行執行所有用戶請求return forkJoin(userRequests);})
).subscribe({next: completeUsers => {console.log('完整用戶數據:', completeUsers);/* 輸出:[{id: 1,name: 'Alice',details: { age: 25, email: 'alice@example.com' },posts: [{ id: 101, title: 'Alice的第一篇帖子' }]},{id: 2,name: 'Bob',details: { age: 30, email: 'bob@example.com' },posts: [{...}, {...}]}]*/},error: err => console.error('獲取用戶數據失敗:', err)
});// 2. 實際應用:表單提交后并行更新多個資源
function updateResources(userData, postsData, settingsData) {return forkJoin({user: from(fetch('/api/user', {method: 'PUT',body: JSON.stringify(userData)})),posts: from(fetch('/api/posts', {method: 'POST',body: JSON.stringify(postsData)})),settings: from(fetch('/api/settings', {method: 'PATCH',body: JSON.stringify(settingsData)}))}).pipe(map(responses => ({user: responses.user.json(),posts: responses.posts.json(),settings: responses.settings.json()})));
}// 使用示例
updateResources({ name: '新名字' },[{ title: '新帖子' }],{ theme: 'dark' }
).subscribe({next: results => {console.log('所有資源更新成功:', results);},error: err => {console.error('更新失敗:', err);// 顯示錯誤提示}
});

這些示例展示了 RxJS 操作符在實際開發中的典型用法。關鍵點:

  1. Observable 是基礎,代表數據流
  2. of 用于創建簡單的同步流
  3. from 用于從各種數據源創建流
  4. forkJoin 用于并行執行多個 Observable 并合并結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84238.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QGrphicsScen畫布網格和QGrphicsItem對齊到網格

#include <QGraphicsScene> #include <QPainter> #include <QWheelEvent> #include <QGraphicsView> class MyGraphicsView : public QGraphicsView { public:MyGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene){}protected:// 重寫滾輪事…

深入解析自然語言處理中的語言轉換方法

在數字化浪潮席卷全球的今天&#xff0c;自然語言處理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;作為人工智能領域的核心技術之一&#xff0c;正深刻地改變著我們與機器交互的方式。其中&#xff0c;語言轉換方法更是 NLP 的關鍵組成部分&#xff0c…

VRRP虛擬路由器協議的基本概述

目錄 vrrp是什么&#xff1f; VRRP的一些概念與專有名詞 VRRP的Master選舉規則&#xff1a; 尾聲 vrrp是什么&#xff1f; vrrp全名virtual router redundance protocol&#xff0c;虛擬路由器冗余協議 VRRP的一些概念與專有名詞 1&#xff09;VRRP設備&#xff1a;運行VRRP…

數據結構 -- 交換排序(冒泡排序和快速排序)

冒泡排序 基于“交換”的排序&#xff1a;根據序列中兩個元素關鍵字的比較結果來對換這兩個記錄在序列中的位置 //交換 void swap(int &a,int &b){int temp a;a b;b temp; }//冒泡排序 void BubbleSort(int A[],int n){for(int i0;i<n-1;i){bool flag false; …

多模態AI終極形態?GPT-5與Stable Diffusion 3的融合實驗報告

多模態AI終極形態&#xff1f;GPT-5與Stable Diffusion 3的融合實驗報告 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 多模態AI終極形態&#xff1f;GPT-5與Stable Diffusion 3的融合實驗報告摘要引言技術架構對…

ajax中get和post的區別,datatype返回的數據類型有哪些?

GET 請求 和 POST 請求 是 HTTP 協議中常用的兩種請求方法&#xff0c;它們主要的區別在于&#xff1a; GET 請求&#xff1a; 數據傳輸方式&#xff1a;數據通過 URL 傳遞&#xff0c;通常是附加在 URL 后面的查詢字符串中&#xff0c;例如 https://example.com/page?nameJoh…

101 alpha_59

(0 - (1 * (rank((sum(returns, 10) / sum(sum(returns, 2), 3))) * rank((returns * cap))))) 0 - (1 * A * B) A rank((sum(returns, 10) / sum(sum(returns, 2), 3)))B rank((returns * cap)) sum(returns, 10)&#xff1a;計算過去 10 期收益率的總和sum(returns, 2)&…

vscode里幾種程序調試配置

標題調試python嵌入的c代碼,例如 import torch from torch.utils.cpp_extension import loadtest_load load(nametest_load, sources[test.cpp],extra_cflags[-O0, -g],#extra_cflags[-O1],verboseTrue, ) a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6]) result te…

深入解析MySQL中的HAVING關鍵字:從入門到實戰

引言 在SQL查詢中&#xff0c;數據過濾是核心操作之一。我們常用WHERE子句進行行級過濾&#xff0c;但當需要對分組后的結果進行條件篩選時&#xff0c;HAVING關鍵字便成為不可或缺的工具。本文將深入探討HAVING的作用、使用場景及其與WHERE的區別&#xff0c;并通過實際案例幫…

根據YOLO數據集標簽計算檢測框內目標面積占比(YOLO7-10都適用)

程序&#xff1a; 路徑改成自己的&#xff0c;閾值可以修改也可以默認 #zhouzhichao #25年5月17日 #計算時頻圖中信號面積占檢測框面積的比值import os import numpy as np import pandas as pd from PIL import Image# Define the path to the directory containing the lab…

AI神經網絡降噪 vs 傳統單/雙麥克風降噪的核心優勢對比

1. 降噪原理的本質差異 對比維度傳統單/雙麥克風降噪AI神經網絡降噪技術基礎基于固定規則的信號處理&#xff08;如譜減法、維納濾波&#xff09;基于深度學習的動態建模&#xff08;DNN/CNN/Transformer&#xff09;噪聲樣本依賴預設有限噪聲類型訓練數據覆蓋數十萬種真實環境…

了解Android studio 初學者零基礎推薦(3)

kotlin中的數據類及對象 使用泛型創建可重復使用的類 我們將常在線答題考試&#xff0c;有的考試題型包括判斷&#xff0c;或者填空&#xff0c;以及數學題&#xff0c;此外試題內容還包括難易程度&#xff1a;"easy”,"medium"&#xff0c;"hard",…

【占融數科-注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

記錄一次請求數據很慢的災難

起因&#xff1a; 因公司業務需要&#xff0c;對接了一個平臺的 api。對接完成之后&#xff0c;發現只要打開開關&#xff0c;就別的接口就訪問很慢&#xff0c;出現 gatway time out。 排查&#xff1a; 先看下主服務器和 slave 服務器的狀態&#xff1a; 主服務&#xff…

力扣-將x減到0的最小操作數

1.題目描述 2.題目鏈接 1658. 將 x 減到 0 的最小操作數 - 力扣&#xff08;LeetCode&#xff09; 3.題目分析 1&#xff09;正面求解困難 題目要求我們每次都從最左邊或者最右邊取一個數&#xff0c;使x-元素的值&#xff0c;并在數組中移除該元素。最后返回的最小操作數…

排序復習/上(C語言版)

目錄 1.排序概念 2.冒泡排序 效率性能測試代碼&#xff1a; 性能分析&#xff1a; 3.直接插入排序 單趟&#xff1a; 整體&#xff1a; 性能分析&#xff1a; 4.希爾排序&#xff08;基于插入排序的優化&#xff09; 單趟單組&#xff1a; 單趟多組&#xff1a; 降低…

程序編輯器快捷鍵總結

程序編輯器快捷鍵總結 函數跳轉 函數跳轉 Creator : F2VSCode : F12visual Studio : F12

【LUT技術專題】極小尺寸LUT算法:TinyLUT

TinyLUT: Tiny Look-Up Table for Efficient Image Restoration at the Edge&#xff08;2024 NeurIPS&#xff09; 專題介紹一、研究背景二、TinyLUT方法2.1 Separable Mapping Strategy2.2 Dynamic Discretization Mechanism 三、實驗結果四、總結 本文將從頭開始對TinyLUT: …

解決:VMware 虛擬機 Ubuntu 系統共享文件夾無法訪問問題

以下是解決 VMware 虛擬機 Ubuntu 系統共享文件夾無法訪問 問題的完整過程總結&#xff0c;按關鍵步驟和邏輯順序梳理&#xff1a; 系統版本&#xff1a;Ubuntu 22.04.5 1. 確認 VMware Tools 已安裝 驗證方法&#xff1a;通過 ps -ef | grep vmtoolsd 檢查是否存在 vmtools…

YOLOv8 的雙 Backbone 架構:解鎖目標檢測新性能

一、開篇&#xff1a;為何踏上雙 Backbone 探索之路 在目標檢測的領域中&#xff0c;YOLOv8 憑借其高效與精準脫穎而出&#xff0c;成為眾多開發者和研究者的得力工具。然而&#xff0c;傳統的單 Backbone 架構&#xff0c;盡管已經在諸多場景中表現出色&#xff0c;但仍存在一…