Angular 保姆级别教程三

news2024/11/27 18:45:39

RxJS

13.1.1 什么是 RxJS ?

RxJS 是一个用于处理异步编程的 JavaScript 库,目标是使编写异步和基于回调的代码更容易。

13.1.2 为什么要学习 RxJS ?

就像 Angular 深度集成 TypeScript 一样,Angular 也深度集成了 RxJS。

服务、表单、事件、全局状态管理、异步请求 …

13.1.3 快速入门
  1. 可观察对象 ( Observable ) :类比 Promise 对象,内部可以用于执行异步代码,通过调用内部提供的方法将异步代码执行的结果传递到可观察对象外部。

  2. 观察者 ( Observer ):类比 then 方法中的回调函数,用于接收可观察对象中传递出来数据。

  3. 订阅 ( subscribe ):类比 then 方法,通过订阅将可观察对象和观察者连接起来,当可观察对象发出数据时,订阅者可以接收到数据。
    在这里插入图片描述

   import { Observable } from "rxjs"
   
   const observable = new Observable(function (observer) {
     setTimeout(function () {
       observer.next({
         name: "Tom"
       })
     }, 2000)
   })
   
   const observer = {
     next: function (value) {
       console.log(value)
     }
   }
   
   observable.subscribe(observer)
13.2 可观察对象
13.2.1 Observable
  1. 在 Observable 对象内部可以多次调用 next 方法向外发送数据。

    const observable = new Observable(function (observer) {
      let index = 0
      setInterval(function () {
        observer.next(index++)
      }, 1000)
    })
    
    const observer = {
      next: function (value) {
        console.log(value)
      }
    }
    
    observable.subscribe(observer)
    
  2. 当所有数据发送完成以后,可以调用 complete 方法终止数据发送。

    const observable = new Observable(function (observer) {
      let index = 0
      let timer = setInterval(function () {
        observer.next(index++)
        if (index === 3) {
          observer.complete()
          clearInterval(timer)
        }
      }, 1000)
    })
    
    const observer = {
      next: function (value) {
        console.log(value)
      },
      complete: function () {
        console.log("数据发送完成")
      }
    }
    
    observable.subscribe(observer)
    
  3. 当 Observable 内部逻辑发生错误时,可以调用 error 方法将失败信息发送给订阅者,Observable 终止。

    import { Observable } from "rxjs"
    
    const observable = new Observable(function (observer) {
      let index = 0
      let timer = setInterval(function () {
        observer.next(index++)
        if (index === 3) {
          observer.error("发生错误")
          clearInterval(timer)
        }
      }, 1000)
    })
    
    const observer = {
      next: function (value) {
        console.log(value)
      },
      error: function (error) {
        console.log(error)
      }
    }
    
    observable.subscribe(observer)
    
    1. 可观察对象是惰性的,只有被订阅后才会执行
    const observable = new Observable(function () {
      console.log("Hello RxJS")
    })
    // observable.subscribe()
    
  4. 可观察对象可以有 n 多订阅者,每次被订阅时都会得到执行
    在这里插入图片描述

    const observable = new Observable(function () {
      console.log("Hello RxJS")
    })
    
    observable.subscribe()
    observable.subscribe()
    observable.subscribe()
    observable.subscribe()
    observable.subscribe()
    
  5. 取消订阅

    import { interval } from "rxjs"
    
    const obs = interval(1000);
    const subscription = obs.subscribe(console.log);
    
    setTimeout(function () {
      subscription.unsubscribe()
    }, 2000)
    
    13.2.2 Subject
  6. 用于创建空的可观察对象,在订阅后不会立即执行,next 方法可以在可观察对象外部调用

    import { Subject } from "rxjs"
    
    const demoSubject = new Subject()
    
    demoSubject.subscribe({next: function (value) {console.log(value)}})
    demoSubject.subscribe({next: function (value) {console.log(value)}})
    
    setTimeout(function () {
      demoSubject.next("hahaha")
    }, 3000)
    
    13.2.3 BehaviorSubject

拥有 Subject 全部功能,但是在创建 Obervable 对象时可以传入默认值,观察者订阅后可以直接拿到默认值。

import { BehaviorSubject } from "rxjs"

const demoBehavior = new BehaviorSubject("默认值")
demoBehavior.subscribe({next: function (value) {console.log(value)}})
demoBehavior.next("Hello")
13.2.3 ReplaySubject

功能类似 Subject,但有新订阅者时两者处理方式不同,Subject 不会广播历史结果,而 ReplaySubject 会广播所有历史结果。

import { ReplaySubject } from "rxjs"

const rSubject = new ReplaySubject()

rSubject.subscribe(value => {
  console.log(value)
})

rSubject.next("Hello 1")
rSubject.next("Hello 2")

setTimeout(function () {
  rSubject.subscribe({next: function (value) {console.log(value)}})
}, 3000)
13.3 辅助方法
13.3.1 range

range(start, length),调用方法后返回 observable 对象,被订阅后会发出指定范围的数值。
在这里插入图片描述

import { range } from "rxjs"

range(0, 5).subscribe(n => console.log(n))

// 0
// 1
// 2
// 3
// 4

方法内部并不是一次发出 length 个数值,而是发送了 length 次,每次发送一个数值,就是说内部调用了 length 次 next 方法。

13.3.2 of

将参数列表作为数据流返回。

在这里插入图片描述

of("a", "b", [], {}, true, 20).subscribe(v => console.log(v))
13.3.3 from

在这里插入图片描述

将 Array,Promise, Iterator 转换为 observable 对象。

from(["a", "b", "c"]).subscribe(v => console.log(v))
// a
// b
// c
import { from } from "rxjs"

function p() {
  return new Promise(function (resolve) {
    resolve([100, 200])
  })
}

from(p()).subscribe(v => console.log(v))
// [100, 200]
13.3.4 interval、timer

Interval:每隔一段时间发出一个数值,数值递增
在这里插入图片描述

import { interval } from "rxjs"

interval(1000).subscribe(n => console.log(n))

**timer **:间隔时间过去以后发出数值,行为终止,或间隔时间发出数值后,继续按第二个参数的时间间隔继续发出值
在这里插入图片描述

import { timer } from "rxjs"

timer(2000).subscribe(n => console.log(n))
timer(0, 1000).subscribe(n => console.log(n))
13.3.5 Concat

合并数据流,先让第一个数据流发出值,结束后再让第二个数据流发出值,进行整体合并。
在这里插入图片描述

import { concat, range } from "rxjs"

concat(range(1, 5), range(6, 5)).subscribe(console.log)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

雷池WAF自动化实现安全运营实操案例终极篇

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Cookie与Session详解与应用

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词:青山一道同云雨,明月何曾是两乡🐹 目录 Cookie和Session 伪造Cookie 获取Cookie数据 传统方法获取Cookie​编辑 使用注解获取Cookie 设…

【CXL协议-性能注意事项(13)】

13.0 Performance Considerations CXL 为加速器访问系统提供了低延迟、高带宽的路径。CXL 的性能取决于多种因素。表 13-1 列出了 CXL 的主要性能属性。 1.实现的带宽取决于协议和有效载荷大小。CXL.cache 和 CXL.mem 的效率预计为 60-90%。效率与 CXL.io 上的 PCIe* 类似 一…

Git的多人协作模式与企业级开发模型

目录 多人协作一 1.要完成的任务 2.准备操作 3.用户的开发操作 4.merge操作 多人协作二 1.要完成的任务 2.用户的开发操作 3.merge操作 4.解决远程分⽀删除后,本地git branch -a 依然能看到的问题 企业级开发模型 1.了解一些常识 2.系统开发环境…

(Golang)初识Go语言!!为什么选择Go?如何配置Go的开发环境?VS Code如何配置Go环境?

1. Go能做什么? go的优点:运行速度快、并发能力强 Go的应用领域: 区块链应用(BT、分布式账本技术) 后端服务应用 例如: 美团后台流量支撑程序 支撑主站的后台流量(排序、推荐、搜索等&#xf…

芯知识 | NVH-FLASH语音芯片支持平台做语音—打造音频IC技术革新

随着科技的飞速发展,人们对于电子产品的音频性能要求越来越高。在这种背景下,NVH-FLASH系列语音芯片应运而生,作为音频IC领域的一次重大技术革新,NVH-FLASH系列语音芯片凭借其卓越的性能与灵活的支持平台,正逐步引领着…

Java 解决阿里云OSS服务器私有权限图片通过URL无法预览的问题

简单描述一下此场景的业务: 由于系统中需要将上传的图片在系统中展示(private私有权限不能直接通过url直接展示),不想通过先下载下来然后以流的形式返回给前台展示这种方法很不友好,毕竟现在前台展示方式都是通过图片URL进行展示,所以就上官网查看API文档,果然找到了解决…

【数据库】Mysql的锁类型

Mysql中的锁机制主要是为了保证数据的一致性和完整性,在并发的情况下起着至关重要的作用。其中锁的类型主要是分为以下几种: 按照粒度分类 全局锁:对于整个数据库实例进行枷锁,加锁后整个实例就处于只读的状态。局锁通常用于需要…

Gin框架操作指南01:开山篇

Gin是目前最流行,性能最好的的GoWeb框架,几乎成为了学习GoWeb必备的知识。本人最近也在学Gin,在b站搜了很多教程,发现有的教程不够详细,有的教程工具包安装有问题,而官方文档的很多示例代码又不全&#xff…

基于卷积神经网络的中草药识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 卷积神经网络,中草药识别系统,resnet50,mobilenet【pytorch框架,python】_哔哩哔哩_bilibili (一)简介 基于卷积神经网络的中…

3.添加缓存和缓存更新策略

项目地址:https://github.com/liwook/PublicReview 添加缓存 查询商铺缓存 我们查询商店的时候,通过接口查询到的数据有很多,我们希望在此用Redis缓存数据,提高查询速度。 对于店铺的详细数据,这种数据变化比较大&a…

Win安装Redis

目录 1、下载 2、解压文件并修改名称 3、前台简单启动 4、将redis设置成服务后台启动 5、命令启停redis 6、配置文件设置 1、下载 【下载地址】 2、解压文件并修改名称 3、前台简单启动 redis-server.exe redis.windows.conf 4、将redis设置成服务后台启动 redis-server -…

xlnt加载excel报错:xl/workbook.xml:2:2581: error: attribute ‘localSheetId‘ expected

解决方案 大家不一定能看懂,地址里说的啥意思,地址过去主要说明了从https://github.com/musshorn/xlnt/tree/issue_685合入可以解决问题,后面再想推送到官方地址,但没人维护了。 我这边直接给大家说一个结果就是:问题…

python 爬虫 入门 四、线程,进程,协程

线程和进程大部分人估计都知道,但协程就不一定了。 一、进程 进程是操作系统分配资源和调度的基本单位,一个程序开始运行时,操作系统会给他分配一块独立的内存空间并分配一个PCB作为唯一标识。初始化内存空间后进程进入就绪态,PC…

GUI编程

GUI编程 【Java从0到架构师课程】笔记 GUI简介 GUI:图形用户界面,在计算机中采用图形的方式显示用户界面 java的GUI开发 AWT:java最早推出的GUI编程开发包,界面风格跟随操作系统SWT:eclipse就是java使用SWT开发的Sw…

【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案

文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…

从零开始学PHP之变量作用域数据类型

一、数据类型 上篇文章提到了数据类型,在PHP中支持以下几种类型 String (字符串)Integer(整型)Float (浮点型)Boolean(布尔型)Array(数组)Objec…

滤波算法与SLAM:从概率角度理解SLAM问题

滤波算法与SLAM 第三章:MAP/MLE问题和贝叶斯网络 文章目录 滤波算法与SLAM前言一、最大后验问题(MAP)与最大似然问题(MLE)二、贝叶斯网络与SLAM问题三、因子图与SLAM问题四、从概率角度理解Kalman Filter与SLAM 前言 …

我谈傅里叶变换幅值谱的显示

在图像处理和分析中通常需要可视化图像傅里叶变换的幅值谱。通过幅值谱,可以直观地观察频率成分的分布,帮助理解图像的结构和特征。 很多刊物中直接显示傅里叶变换的幅值谱。 FFT fftshift(fft2(double(Img))); FFT_mag mat2gray(log(1abs(FFT)));由…

【Linux】线程基本概念,线程控制

目录 基本概念 重新理解进程 线程真实存在吗? 问题解答 线程资源 线程控制 线程创建 如何全面看待线程函数传参 如何看到线程函数返回 线程查询 线程等待 线程终止 线程分离 基本概念 线程(thread)是指在单个进程内,多…