首页 > 其他分享 >30 天精通 RxJS (08):简易拖拉实作 - take, first, takeUntil, concatAll

30 天精通 RxJS (08):简易拖拉实作 - take, first, takeUntil, concatAll

时间:2024-04-03 23:49:24浏览次数:27  
标签:concatAll 实作 complete 08 source ----- console example log

RxJS Logo

我们今天要接着讲 take, first, takeUntil, concatAll 这四个 operators,并且实作一个简易的拖拉功能。

Operators

take

take 是一个很简单的 operator,顾名思义就是取前几个元素后就结束,范例如下

var source = Rx.Observable.interval(1000)
var example = source.take(3)
example.subscribe({
	next: (value) => {
		console.log(value)
	},
	error: (err) => {
		console.log('Error: ' + err)
	},
	complete: () => {
		console.log('complete')
	},
})
// 0
// 1
// 2
// complete

这里可以看到我们的source原本是会发出无限个元素的,但这里我们用take(3)就会只取前 3 个元素,取完后就直接结束(complete)。

用 Marble diagram 表示如下

source : -----0-----1-----2-----3--..
        take(3)
example: -----0-----1-----2|

first

first 会取 observable 送出的第 1 个元素之后就直接结束,行为跟 take(1) 一致。

var source = Rx.Observable.interval(1000)
var example = source.first()
example.subscribe({
	next: (value) => {
		console.log(value)
	},
	error: (err) => {
		console.log('Error: ' + err)
	},
	complete: () => {
		console.log('complete')
	},
})
// 0
// complete

用 Marble diagram 表示如下

source : -----0-----1-----2-----3--..
        first()
example: -----0|

takeUntil

在实务上 takeUntil 很常使用到,他可以在某件事情发生时,让一个 observable 直送出 完成(complete)讯息,范例如下

var source = Rx.Observable.interval(1000)
var click = Rx.Observable.fromEvent(document.body, 'click')
var example = source.takeUntil(click)

example.subscribe({
	next: (value) => {
		console.log(value)
	},
	error: (err) => {
		console.log('Error: ' + err)
	},
	complete: () => {
		console.log('complete')
	},
})
// 0
// 1
// 2
// 3
// complete (点击body了)

这里我们一开始先用interval建立一个 observable,这个 observable 每隔 1 秒会送出一个从 0 开始递增的数值,接着我们用takeUntil,传入另一个 observable。

当传入takeUntil的 observable 发送值时,原本的 observable 就会直接进入完成(complete)的状态,并且发送完成讯息。 也就是说上面这段代码的行为,会先每 1 秒印出一个数字(从 0 递增)直到我们点击 body 为止,他才会送出 complete 讯息。

如果画成 Marble Diagram 则会像下面这样

source : -----0-----1-----2------3--
click  : ----------------------c----
        takeUntil(click)
example: -----0-----1-----2----|

当 click 一发送元素的时候,observable 就会直接完成(complete)。

concatAll

有时我们的 Observable 送出的元素又是一个 observable,就像是二维阵列,阵列里面的元素是阵列,这时我们就可以用concatAll把它摊平成一维阵列,大家也可以直接把 concatAll 想成把所有元素 concat 起来。

var click = Rx.Observable.fromEvent(document.body, 'click')
var source = click.map((e) => Rx.Observable.of(1, 2, 3))
var example = source.concatAll()
example.subscribe({
	next: (value) => {
		console.log(value)
	},
	error: (err) => {
		console.log('Error: ' + err)
	},
	complete: () => {
		console.log('complete')
	},
})

这个范例我们每点击一次 body 就会立刻送出 1,2,3,如果用 Marble diagram 表示则如下

click  : ------c------------c--------
        map(e => Rx.Observable.of(1,2,3))
source : ------o------------o--------
                \            \
                 (123)|       (123)|
                   concatAll()
example: ------(123)--------(123)------------
本系列仅作为学习记录所用,摘录自 30天精通Rxjs!强烈推荐!膜拜大佬!

标签:concatAll,实作,complete,08,source,-----,console,example,log
From: https://www.cnblogs.com/xiaojiuwow/p/18113721

相关文章

  • ADS1298的国产代替芯片LHE7908
    LHE7904、LHE7906、LHE7908(LHE790X)是多通道同步采样24位Δ-Σ模数转换器(ADC)系列,内置有可编程增益放大器(PGA)、内部基准以及振荡器。LHE790X包含医疗心电图(ECG)和脑电图(EEG)应用中通常所需的全部功能。凭借高集成度和出色性能,LHE790X能够以大幅缩小的尺寸、显著降低的功......
  • 【题解】AGC008F | 思维 统计技巧 换根 二次扫描
    题意:给出一个\(n\)个点的树(边权为\(1\))和集合\(S\),求有多少个点集\(T\)可以被表示为离\(S\)中的一个点\(u\)距离不超过\(d\)的点构成的集合(下文称为\(u\)的\(d\)级邻域)。考虑\(S\)为所有点的特殊情况:我们直接求每个点邻域的个数再求和,会算重一些点集,这种情况......
  • AGC008E Next or Nextnext 解题报告
    \(\text{分析}\)\(i\toa_i\)构成内向基环树,配合暴力程序观察内向基环树常见的一些特殊情况:灰色笔对应的是\(i\toa_i\),黑色笔对应的是\(i\top_i\),我们相当于要构造一个黑色的排列(若干环)使得每一条灰色边的起点可以通过一条或两条黑色边到达终点。\(a_i=i\)(全是自环):可以任......
  • 服务器windows server2008突然不能访问某些网站、远程桌面打不开
    下载这个软件,并选择BestPractices,再Apply z直接Apply,没有用IIS Crypto是一个免费工具,使管理员能够在WindowsServer2008、2012、2016、2019和2022上启用或禁用协议、密码、哈希和密钥交换算法。它还允许您重新排序IIS提供的SSL/TLS密码套件、更改高级设置、通过单......
  • 洛谷 P1008 [NOIP1998 普及组] 三连击
    这道题我们可以用桶排序来做,代码如下:#include<bits/stdc++.h>//万能头 usingnamespacestd;//好习惯 inta[10];//一个桶数组,来确定是否有重复的 intmain(){   ints1,s2,s3;//定三个函数,用于判断    intsum=0;//用于判断数字是否重复    for(int......
  • MIT 6.S081入门lab10 mmap
    MIT6.S081入门lab10mmap一、参考资料阅读与总结1.JournalingtheLinuxext2fsFilesystem文件系统可靠性:磁盘崩溃前数据的稳定性;故障模式的可预测性;操作的原子性-论文核心:将日志事务系统加入Linux的文件系统中;事务系统的要求:元数据的更新;事务系统的顺序性;数据块写入磁......
  • C#对接部标JT808协议实现北斗定位设备数据接收服务端
    一、前言介绍开发一套能够支撑几万台北斗定位设备数据接收的服务端,用于接收北斗定位器定位数据的平台。项目基于windows平台,C#语言开发框架NetFramework4.8,TCP主要基于SuperSocket用来构建一个服务器端Socket程序,JT808.ProtocolJT/T808协议快速开发包,开发工具采用了微软的Vis......
  • stm32cubeide 调试非 0x08000000 地址程序配置
    使用stm32cubeide调试非0x08000000,我们需要一些配置.ld链接脚本条件编译目前如果要修改程序的启动地址需要修改两个地方system_stm32f103xx.c中的VECT_TAB_OFFSET,可通过宏定义开启或者关闭.ld链接脚本,可通过宏进行条件编译,也可以直接修改ld,创建不同的链接脚本文件,创建......
  • 0080-基于单片机的智能水杯仿真设计
    功能描述1、采用51单片机作为主控芯片;2、采用1602液晶显示:当前时间、喝水定时、水温、水量(水余量/喝水量);4、采用DS1302时钟芯片;5、采用PCF8591作为水量检测ADC;6、能够自动计算单次喝水量;7、采用18B20传感器检测水温;8、到喝水定时的时间,声光报警提醒;9、可通过按键随时......
  • P2036 [COCI2008-2009 #2] PERKET
    题目链接:本题显然考查\(\rmDFS\),但需注意是否恢复现场和参数设置的细节。#include<cstdio>#include<algorithm>constintN=15;structEdge{ intsour; intsweet;}e[N];boolst[N];//判断每个位置的数有没有被考虑过ints=1,t;//分别代表总的酸度和甜度......