15_Rxjs

简介: 15_Rxjs

Rxjs是JavaScript的一个扩展,基于观察者模式

观察者模式和发布订阅系统的区别

观察者模式定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知,中间没有第三方作为调度中心,依赖和被依赖方是直接“对话“的。

发布订阅系统有一个“中间商”,一般被称为调度中心或事件通道,用以过滤发布者的信息并维持发布者和订阅者之间的关系

Rxjs主要由三部分组成:

  1. Observable 被观察的对象
  2. subscription 监听Observable的变化
  3. Operators   一些函数,可以处理管道的数据

接下来我们创建一个简单的Observable—subscription关系

import { Observable } from 'rxjs'
// new 一个observable对象,该对象的构造器接收一个回调函数用于发布内容
const observable = new Observable((subscribe) => {
  subscribe.next(1)
  subscribe.next(2)
  subscribe.next(3)
  // 支持异步写法
  setTimeout(() => {
    subscribe.next(4)
    // complete方法指示通知完成,不支持传入参数
    subscribe.compete()
  }, 2000)
})
// observable上有一个subscribe方法,该方法接收一个配置对象
observable.subscribe({
  // 所有next方法发布的内容都会按顺序被传到这个函数
  next: (value) => {
    console.log(value)
  },
})

看看这个next,很像迭代器对吧? ——小满zs

import { Observable, of, interval, take } from 'rxjs'
// 这里subscribe接收一个回调函数,可以直接接收到发布的内容
interval(50).pipe(take(5)).subscribe(value => {
    console.log(value)
})

函数

功能

of

接收若干number类型参数,用next()方法分别将这些参数发布出去

interval

类似循环定时器,接收一个number类型的参数指定next方法调用的时间间隔。序列从0开始发送,如果不施加外力会一直进行下去

take

接收一个number类型的参数确定next方法调用的次数,通常和interval方法共用

除了上述API,管道中还可以添加其他处理函数实现不同功能

import { Observable, of, interval, take } from 'rxjs'
import { filter, map } from 'rxjs/operators'
const subs = interval(500).pipe(retry(3),map(v => ({ num:v })),filter(v => v.num % 2 == 0)).subscribe(value => {
    console.log(value)
    if(value.num == 10){
        subs.unsubscribe()
    }
})

函数

功能

map

同JavaScript中的map,将返回值封装成一个数组后返回

filter

同JavaScript中的filter,检查每个元素是否通过测试,通过则返回

retry

接收一个number类型的参数,作用是如果pipe方法之前的代码抛出错误,retry会再次尝试执行n次出错的代码,通常在pipe之前的方法需要请求接口时使用

import { Observable, of, interval, take, fromEvent } from 'rxjs'
import { filter, map, retry } from 'rxjs/operators'
const click$ = fromEvent(document, 'click').pipe(map((v) => v.target))
click$.subscribe((e) => {
  console.log(e)
})

fromEvent是一个用于监听DOM事件的函数,该函数接受两个参数,第一个是document对象,第二个是事件名。它返回一个事件观察者对象,可以通过这个对象的subscribe方法查看事件参数e。formEvent同样支持在管道流中进行逻辑处理

目录
相关文章
|
前端开发
在微前端qiankun中使用Vite你踩坑了吗?(下)
哈喽,我是树酱。之前搭建的微前端体系已经稳步运行将近两年了,最近遇到一些童鞋反馈。之前据说qiankun并不支持Vite打包的应用,那是不是我就无法使用了?
3419 0
在微前端qiankun中使用Vite你踩坑了吗?(下)
|
小程序 JavaScript
【微信小程序】-- 自定义组件 - 数据监听器 (三十四)
【微信小程序】-- 自定义组件 - 数据监听器 (三十四)
|
测试技术
CRC-16 MODBUS原理,附实测可用源码
之前做串口解析,CRC校验一直用和校验,就是吧各个位加在一起,新来一个串口协议,是CRC-16 MODBUS的形式校验,不会呀,从网上找了找资源,没有找到源码,都要下载,分享出来。
CRC-16 MODBUS原理,附实测可用源码
|
6月前
|
缓存 IDE 调度
【HarmonyOS Next之旅】基于ArkTS开发(一) -> Ability开发一
本文介绍了HarmonyOS中的FA模型及其开发相关内容,包括PageAbility与ServiceAbility的开发方法。FA模型下的Ability分为多种类型,如PageAbility(带UI,用户可见可交互)、ServiceAbility(无UI,在后台提供服务)等。文章详细阐述了PageAbility的生命周期、启动模式及接口使用,并通过代码示例展示了如何启动本地PageAbility和重写生命周期函数。
223 12
|
8月前
|
人工智能 网络协议 Java
RuoYi AI:1人搞定AI中台!开源全栈式AI开发平台,快速集成大模型+RAG+支付等模块
RuoYi AI 是一个全栈式 AI 开发平台,支持本地 RAG 方案,集成多种大语言模型和多媒体功能,适合企业和个人开发者快速搭建个性化 AI 应用。
1855 77
RuoYi AI:1人搞定AI中台!开源全栈式AI开发平台,快速集成大模型+RAG+支付等模块
|
前端开发 JavaScript API
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
480 0
qiankun框架中基于actions机制实现主应用与子应用间的双向通信
qiankun框架中基于actions机制实现主应用与子应用间的双向通信
813 0
vue2 自定义 v-model (model选项的使用)
vue2 自定义 v-model (model选项的使用)
1712 1
|
存储 安全 物联网
安防摄像头IPC如何快速接入阿里云Link Visual视频服务(阿里云生活物联网)
Link Visual是生活物联网平台针对视频产品推出的增值服务,提供视频数据上云、存储、转发、AI计算等能力。 大白话就是:通过阿里云的Link Visual视频服务,可以让你的IPC摄像头设备完成上云功能,并快速实现如下功能介绍中的功能。其中可以享受阿里云P2P协议支持,帮助企业节省流量服务器流量带宽。
1298 7
Vue3 globalProperties 的使用(代替 Vue.prototype.$xxx)
Vue3 globalProperties 的使用(代替 Vue.prototype.$xxx)
498 0