rxjs6学习笔记----结合react,redux使用

(六)温故知新系列之RXJS——RXJS操作符基础(转化类) 合并类操作符把多个数据流汇合为⼀个数据 流,但是汇合之前数据是怎样,在汇合之后还是那样;过滤类操作符可以 筛选掉⼀些数据,其中回压控制的过滤类操作符还可以改变数据传递给下 游的时间,但是数据本⾝不会变化,怎么进就怎么出。这⼀章会介绍RxJS 对于数据的转化处理,也就是让数据管道中的数据发⽣变化。转化类和过滤类操作符都对数据做⼀些处理,但是过滤类做的处理是 筛选,决定哪些数据传递给下游,并不对数据本⾝做处理;⽽转化类操作 符不做过滤,会对每个具体数据做⼀些转化。 阅读详情

rxjs版本是当前2018-07-23最新, 6.2.2。本文写了rxjs的基本知识和结合react的应用,ajax怎么用rx控制的套路,错误处理,以及常用操作符的细节。如switchMap,concatMap, flatMap的区别等。

"rxjs": "^6.2.2"

导入模块的区别

rxjs已经出到6了,5.5有一个大更新,6又有很多更新。首先是自动rethrow的错误不再是同步的,而是异步的,其次是模块导入的方法。现在只分为两类,前一类,如of, empty等方法,直接从rxjs里导入。
这里写图片描述

正确的导入方式:

import { Observable, Subject, asapScheduler, pipe, of, from, interval, merge, fromEvent, combineLatest, SubscriptionLike, PartialObserver } from 'rxjs';
import { map, filter, scan } from 'rxjs/operators';
import { webSocket } from 'rxjs/webSocket';
import { ajax } from 'rxjs/ajax';
import { TestScheduler } from 'rxjs/testing';

注意concat和combineLatest都要从rxjs里Import

pipe

rxjs5.5以上使用pipe方法而非链式调用。所有链式的起点都用Pipe来开始,之后的每一次处理都用逗号隔开。例子

// rxjs v5.5+
const source$ = range(1, 3)
const liveStreaming$ = source$.pipe(
  flatMap(val => of(val).pipe(
    flatMap(val => from(fetch(`http://swapi.co/api/people/${val}`))),
    flatMap(res => from(res.json())),
    map(res => res.name),
    tap(console.log)
  ))
)

//rxjs old version
let stream$ = Rx.Observable
.of(1,2,3)
.flatMap((val) => {
  return Rx.Observable
            .of(val)
            .ajax({ url : url })
            .map((e) => e.response )
})

再比如一个concat的例子

import {
  interval, concat,
} from 'rxjs'
import {
  take, map,  tap,
} from 'rxjs/operators'

function addItem(val) {
  const node = document.createElement('li')
  const textnode = document.createTextNode(val)
  node.appendChild(textnode)
  document.getElementById('output').appendChild(node)
}
const s1$ = interval(1000).pipe(
  map(val => `s1   ${val}`),
  take(5)
)

const s2$ = interval(500).pipe(
  map(val => `s2  ${val}`),
  take(3)
)

const liveStreaming$ = concat(s1$, s2$).pipe(
  tap(console.log)
)

const subscription = liveStreaming$.subscribe(
  data => addItem(`${data}`),
  err => console.log(err),
  () => console.log('completed')
)

操作符

过滤操作符

distinctUntilChanged

会接收到上一次和这一次的对象作为参数,默认的比较是===,可以传入一个comparer function来自定义。例如,比较两个Object时,可以用R.equals
这个例子来自官网

* @example <caption>An example using a compare function</caption>
 * interface Person {
 *    age: number,
 *    name: string
 * }
 *
 * Observable.of<Person>(
 *     { age: 4, name: 'Foo'},
 *     { age: 7, name: 'Bar'},
 *     { age: 5, name: 'Foo'})
 *     { age: 6, name: 'Foo'})
 *     .distinctUntilChanged((p: Person, q: Person) => p.name === q.name)
 *     .subscribe(x => console.log(x));
 *
 * // displays:
 * // { age: 4, name: 'Foo' }
 * // { age: 7, name: 'Bar' }
 * // { age: 5, name: 'Foo' }
 *

在保存表单时,也可以用它来过滤xhr请求,这是redux里的写法

// epics.js  通常文件名叫epics
const openProject = actions$ => actions$.ofType(OPEN_PROJECT).pipe(
  distinctUntilChanged(R.equals),
  flatMap(
    ({ projectUid }) => request$.post('/api/project/open-status', { projectUid }).pipe(
      map(R.path(['data'])),
     ...

转换操作符

switchMap, flatMap, concatMap 的区别

这三个操作符都是map 与其他操作符的结合。这里简单总结了下,详见30 天精通RxJS(18): Observable Operators - switchMap, mergeMap, concatMap

concatMap = .map(fn).concatAll()
前一个完成后,第二个才会发出,有顺序
switchMap = .map(fn).switch()
下一个发出,则退订前一个。前一个成功也好,失败也好,不会造成任何side-effect了
flatMap = .map(fn).flatAll()  // 其实就是mergeMap, mergeAll()
有摊平的observable的效果,并行处理多个流。可能重叠。

三个操作符都可以传入第二个selector callback 参数,flatMap还可以传第三个参数限制并行处理的数量。

source : -----------c--c------------------...
        concatMap(c => Rx.Observable.interval(100).take(3))
example: -------------0-1-2-0-1-2---------...

source : -----------c--c-----------------...
        concatMap(c => Rx.Observable.interval(100).take(3))
example: -------------0--0-1-2-----------...

source : -----------c-c------------------...
        concatMap(c => Rx.Observable.interval(100).take(3))
example: -------------0-(10)-(21)-2----------...

错误处理

注意catchError本身可以再返回一个流,即catchError之后还可以再catch或者继续做事情。
所以顺序应该是

catchError(fn),
takeUntil(LOCATION_CHANGE$),
finalize(fn)

如果是request失败,需要再次尝试。retry()会立即发出,而在网络不稳定的时候,应该隔一会儿再发请求。需要用到delay 和 retryWhen, 以及 scan 来控制retry 的次数。参见错误处理 · RxJS 5 基本原理。

const ATTEMPT_COUNT = 1
const DELAY_INTERVAL = 200

...

stream$.pipe(
    pluck('data'),
    retryWhen(e => e.pipe(
      scan((errorCount, err) => {
        if (errorCount >= ATTEMPT_COUNT) {
          throw err
        }
        return errorCount + 1
      }, 0),
      delay(DELAY_INTERVAL)
    )),
    catchError((err) => {
      console.error(`Request ${url} Error `, err.stack)
      return throwError(JSON.stringify(err.response.data))
    })

subject

这个话题就多了,包括怎么warm up 一个 observable, 把它从冷的变成热的。什么什么。。。
大意就是,subject是一个代理人的角色,它的subscribe 是把诸多 observer 加入到一个数组中,在next的时候依次通知这些observers 。作为一个中间代理人,它同时拥有 Observer 和 Observable 的行为。

学习资源

rxjs5的中文gitbook,略老但排版好看,适合入门
rxjs的github,在reactiveX下面,已经到6版本了 RxJS: Reactive Extensions For JavaScript
rxjs 英文官网,关于如何迁移到版本6
rxjs 中文翻译官方文档 比较全,翻译的一般般吧。。。
一个博客上关于rxjs的系列入门文章,英文的
hot-cold-observables,什么是热的观察对象,什么是冷的observable,怎么warm up

RxJS -- (pluck、distinctUntilChanged、distinct) 碎碎念:知识点梳理归纳,如果有什么不对的感谢大家指正一起学习! 版本为6 pluck 把上游数据中特定字段的值"拔"出来 将每个源值(对象)映射成它指定的嵌套属性。 选择属性来发出值 例1:提取name属性的值 例1:提取name属性的值。如果没有就返回undefined distinctUntilChenged 当当前值与前一个值不同时才发出 返回 Observable,它发出源 Observable 发出的所有与前一项不相同的项(与前一值比较) 这个操作符要保存上游产生的一个数据就足. 阅读详情

相关推荐

RxJS -- (of、from、merge、interval、timer)

switchMap() 将前一个流中的数据在切换时,将它的数据传给下一个流中去使用。 接受一个函数,这个函数时上一个流遗留的数据,而它需要返回一个新的流,这个流中可以使用上一个流遗留下来的数据 会在下一个流(Observable)被送出后直接退订前一个未处理完的流(Observable) pairwise(),成对 4. 将前一个值和当前值作为一个数组放在一起,然后将其发出 相关链接: 5. rxjs中的switch 6. rxjs学习 ...

奇怪的人类 814

新手都能看懂的关于rxjs中的of实现原理解析

function of(...args): Observable<number> { const observable = new Observable(test); function test(obser: Observer<number>): void { args.forEach((val) => { obser.next(val); }); } return observable; } let obser =

qq_35094120的博客 1779

用 STATS_FE 拆开 SAP Web 应用的端到端性能账本

STATS_FE 最适合放在 SAP Web 应用性能分析的第一站。它把一次用户交互拆成前端、网络和后端,把一次业务动作触发的多个 HTTP 请求聚合起来,又能和 STATS 下钻到 ABAP 主统计记录。对于 SAP S/4HANA Fiori、SAPUI5、Web Dynpro ABAP 和 SAP GUI for HTML 场景,这种端到端视角比单看后端响应时间更接近用户真实体验。性能优化最怕方向错。STATS_FE 的核心价值,就是在动手优化之前先把方向定准。前端慢,就看渲染、绑定、脚本和资源。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1079

React-RxJS 开源项目教程

React-RxJS 开源项目教程 项目介绍 React-RxJS 是一个结合了 React 和 RxJS 的开源项目,旨在帮助开发者更高效地处理 React 应用中的数据流。RxJS 是一个强大的响应式编程库,而 React 是一个流行的前端框架。通过将这两者结合,React-RxJS 提供了一种新的方式来管理 React 组件的状态和数据流,使得代码更加简洁和易于维护。 项目快速启动 安装依赖...

gitblog_00657的博客 908

29、RxJS与React、Redux构建响应式应用

本文介绍了如何结合RxJS、React和Redux构建响应式应用程序。通过使用RxJS处理异步操作并提供测试工具,React构建组件化用户界面,以及Redux管理全局状态流,开发者可以高效地实现可维护、可扩展的响应式应用。文章通过一个银行应用的示例,详细讲解了这些技术如何协同工作,并探讨了响应式编程在实际开发中的挑战与解决方案。

ansible6ops的博客 72

React技术原理与代码开发实战:从Redux Saga到RxJS

作者:禅与计算机程序设计艺术 1.背景介绍 React(一款由Facebook推出的JavaScript框架)是一个用于构建用户界面的JavaScript库。其核心思想是将组件化、可复用性和良好的性能相结合,通过 JSX 来声明式地描述用户界面,并且提供了一整套工程化工具链来帮助开发者快速完成应用开

AI天才研究院 357

RxJS + Redux + React = Amazing!(译二)

今天,我将Youtube上的《RxJS + Redux + React = Amazing!》的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https://www.youtube.com/watch?v=AslncyG8whg Observabl...

chuanhang3897的博客 295

rxjs中文文档.pdf

rxJs中文文档,pdf格式,真实有效,欢迎下载。rxJs中文文档,pdf格式,真实有效,欢迎下载。rxJs中文文档,pdf格式,真实有效,欢迎下载

react-router-redux与RxJS集成:响应式路由状态管理

在现代前端应用开发中,路由管理和状态管理是两个核心环节。react-router-redux作为连接react-router和Redux的桥梁,提供了简单直接的绑定方案,而RxJS则为处理异步数据流和事件提供了强大的响应式编程范式。本文将详细介绍如何将这两者结合,构建一个响应式的路由状态管理系统。 ## 核心概念与项目结构 react-router-redux的核心功能在于保持路由状态与Red...

gitblog_00762的博客 485

RxJS中文文档

RxJS中文文档、翻译、原文cn.rx.js.org 请移步查看。。

RXJs中文文档

RXJS中文文档,文档非常完善

RxJS + Redux + React = Amazing!(译一)

今天,我将Youtube上的《RxJS + Redux + React = Amazing!》翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https://www.youtube.com/watch?v=AslncyG8whg 开场白 管理状态很困难,对...

chuanhang3897的博客 250

HFSS微带线仿真从零到一:材料参数与求解设置优化指南

在射频电路设计中,微带线仿真涉及电磁场求解与传输线理论,其精度高度依赖材料参数和求解设置。相对介电常数、损耗角正切和导体电导率等参数直接影响特性阻抗与插入损耗,而求解频率、网格划分和参数扫描则决定仿真效率与收敛性。合理设置这些参数可显著提升S参数准确性,避免设计迭代。应用场景包括天线馈线、滤波器和微波互连。本文基于HFSS微带线仿真实践,系统讲解材料选择与参数优化全链路,帮助工程师快速复现可靠模型。

weixin_29192211的博客 76

关于 RxJS redux-observable

问题1:这个东西有什么用,为什么要用它? redux-observable 作为redux 的一个中间件提供了action 异步处理的能力,并且它基于RxJS,RxJS 是一个强大的库,熟悉Angular 应该不会陌生。如果对RxJS 没有兴趣,那么redux-observable 也没必要去了解了。 为什么要用它呢?个人认为:1 喜欢并熟悉RxJS,2 redux-observable 完全...

sflf36995800的博客 464

Fluent UDF实战:除了速度入口,你的DEFINE_PROFILE宏还能搞定这些边界条件(温度、组分、壁面接触角全解析)

本文深入解析Fluent UDF中DEFINE_PROFILE宏在复杂边界条件中的高阶应用,涵盖温度场、组分浓度和壁面接触角等关键场景。通过实战代码示例,展示如何实现空间梯度温度场、动态组分控制和接触角动态调整,助力CFD工程师突破标准界面限制,提升仿真精度和效率。

weixin_28688385的博客 448

pandas,构造MultiIndex的四种方法:from_tuples、from_arrays、from_product、from_frame

1、from_tuples:通过 “元组对” 构造MultiIndex """ 一对元组,为一个索引 """ tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) 2、from_arrays:通过 “列表元素的组合” 构造MultiIndex """ 列中表的元素,按位置 对应组合,形成索引 """ arrays

jieru_liu的博客 5384

Redux Thunk与RxJS:响应式编程的异步处理

你还在为Redux异步数据流处理烦恼吗?还在回调地狱中挣扎吗?本文将带你深入了解Redux Thunk与RxJS的结合使用,一文解决React应用中的异步处理难题。读完本文,你将能够: - 理解Redux Thunk的核心原理与使用场景 - 掌握RxJS响应式编程思想 - 学会将Redux Thunk与RxJS结合处理复杂异步逻辑 - 优化React应用中的数据流管理 ## Redux Thu...

gitblog_00148的博客 317

深度学习环境搭建以及DeepLabCut安装过程

文章目录 一、查询电脑硬件 安装GeForce驱动程序 二、环境搭建与软件安装 1.安装CUDA运算平台软件 2.安装cuDNN支持包 3.配置环境变量 三、 DeepLabCut环境配置 1.安装Anaconda 2.创建容器环境 3.激活容器环境 4.安装TensorFlow 5.验证TensorFlow是否安装成功 6...

m0_51136557的博客 3155

React-RxJS 是什么?一文读懂 React 与 RxJS 的终极响应式状态管理方案

**React-RxJS**(react-rxjs)是一个为 [React] 提供 **RxJS 响应式绑定** 的轻量级开源库,让你把 RxJS 的流(Observable)直接变成 React 组件中的状态,实现真正响应式的状态管理方案。它体积极小、性能高效、无内存泄漏,并且原生支持 React Suspense 与 Concurrent Mode,是构建大型 React 应用的理想选择之一。

gitblog_00300的博客 493

C51编程25-应用篇(单片机与电脑端实现wifi通讯)

单片机使用ESP-01S wifi模块与电脑端进行数据通讯。

qq_34343637的博客 1万+

点云焊缝提取

本文介绍了一个基于PCL库的点云处理流程,包含三个核心模块:MLS平滑处理通过多项式拟合修正点云位置;差异提取通过双向匹配定位源/目标点云的非重叠区域;统计过滤剔除离群噪声点。该流程采用"平滑-筛选-净化"的通用思路,将复杂算法封装为可配置接口,实现了工业级点云预处理。文章重点分析了各模块的原理、PCL接口调用及参数设计逻辑,同时指出参数调优、算法扩展等深入探索方向,展现了PCL在点云处理中的模块化优势与实用价值。

weixin_45196569的博客 249

redux-observable 中的 Epics 完全指南:基于 RxJS 的 Redux 副作用处理核心原语

redux-observable 的核心原语是 **Epic**:一个接收 action 流、返回 action 流的函数("Actions in, actions out")。本篇指南以 `docs/basics/Epics.md` 为主体,系统讲解 Epic 的类型签名、底层调度原理、与 Redux dispatch 通道的关系、基础与真实世界示例、读取 store 状态的两种方式、多 Epi

gitblog_00415的博客 1058

【反封禁策略】集成 Undetected-Chromedriver:让 Browser-Use 绕过 Cloudflare 五秒盾

摘要:AI Agent如何突破Cloudflare检测的实战指南 本文针对AI Agent在Cloudflare检测下频繁受阻的问题,深入分析了undetected-chromedriver的工作原理与局限性。文章指出,Cloudflare 2026年的检测体系已升级为"浏览器指纹+IP信誉+协议指纹+行为模式"的多维交叉验证,单一伪装方案难以奏效。 核心内容包括: undetected-chromedriver的三层补丁体系解析 v2与v3版本的适用场景对比 两种Browser-Use集成方案:Selen

ZDQ58818的博客 284

React Observable Subscribe 使用教程

React Observable Subscribe 使用教程 项目介绍 react-observable-subscribe 是一个用于在 React 中以声明方式订阅 Observable 流的库。它提供了一个 <Subscribe> 组件,允许你在 JSX 中直接订阅和渲染 Observable 流。这个库不依赖于特定的 Observable 实现,只要 Observable 支...

gitblog_00743的博客 858

【git】win 10 / win 11:git 首次拉取云效平台代码详细教程

git 首次拉取云效平台代码详细教程:Git 生成 SSH 公钥、云效工作台添加 SSH 公钥、git 使用 SSH / HTTP 链接拉取云效代码

顾三殇 —— 博客空间(软件测试) 4215

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

react-router-redux与Redux Observable集成:响应式路由管理

修改Store配置文件,添加redux-observable中间件和routerReducer: ```javascript import { createStore, applyMiddleware, combineReducers } from 'redux'; import { createEpicMiddleware } from 'redux-observable'; import {...

gitblog_00271的博客 374

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 用node-gyp手动编译node的c++扩展模块
下一篇: 解读vue源码之nextTick:何谓 event-loop, 浏览器的事件机制,task/microtasks
十方魔
博客等级 码龄10年 202粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值