当前位置:网站首页>RxJs SwitchMapTo 操作符之移花接木
RxJs SwitchMapTo 操作符之移花接木
2022-08-01 21:54:00 【华为云】
将每个源值投影到同一个 Observable,该 Observable 在输出 Observable 中使用 switchMap 多次展平。
输入一个 Observable,输出一个 function Operator. 实际是一个函数,每次在源 Observable 上发出值时,该函数都会返回一个 新的 Observable.
该函数从给定的 innerObservable 发出项目,并且仅从最近投影的内部 Observable 中获取值。
看个例子:
import { EMPTY, range } from 'rxjs';import { first, take, tap } from 'rxjs/operators';import { fromEvent, interval } from 'rxjs';import { switchMapTo } from 'rxjs/operators';const clicks = fromEvent(document, 'click');const test = event => console.log('Jerry: ', event);const result = clicks.pipe( tap(test), switchMapTo(interval(1000)));result.subscribe(x => console.log(x));
输出:
每次点击之后,click$ 抛出的 PointerEvent,被 switchMapTo 返回的 Function Operator 丢弃了。最后用户订阅 result 函数里,打印的值,是 switchMapTo 输入的 interval(1000) Observable 发射的值,而不再是 clicks$ 抛出的 PointerEvent.
再看另一个在网页显示倒计时数字的例子。
import './style.css';import { interval, fromEvent } from 'rxjs';import { switchMapTo, scan, startWith, takeWhile, finalize} from 'rxjs/operators';const COUNTDOWN_TIME = 10;// referenceconst countdownElem = document.getElementById('countdown');// streamsconst click$ = fromEvent(document, 'click');const countdown$ = interval(2000).pipe( scan((acc, _) => --acc, COUNTDOWN_TIME), startWith(COUNTDOWN_TIME));click$ .pipe( switchMapTo(countdown$), takeWhile(val => val >= -10), finalize(() => (countdownElem.innerHTML = "We're done here!")) ) .subscribe((val: any) => (countdownElem.innerHTML = val));
初始整数是10,每隔2秒钟减一,减到 -10 时停止。
思路:触发计数器开始递减的操作是点击屏幕,因此需要使用 fromEvent 来构造 Observable :click$
每隔两秒钟执行某项操作,因此需要用 interval 构造第二个 Observable.
一旦计数器启动之后,每隔两秒钟需要执行递减操作,因此需要用 switchMapTo,将 click$ 映射成 interval Observable.
之后的值传递,就和 click$ 再无任何关联了。
因为是递减操作,暗示这是一个 stateful 场景,故选用 scan 操作符维护内部状态。
边栏推荐
- FusionGAN:A generative adversarial network for infrared and visible image fusion文章学习笔记
- AI应用第一课:支付宝刷脸登录
- ModuleNotFoundError: No module named ‘yaml‘
- Flink cluster construction
- 使用分类权重解决数据不平衡的问题
- Unity Shader general lighting model code finishing
- number of solutions to solve a multivariate multi-degree equation
- 小程序中的多表联合查询
- 【C语言实现】两种计算平均成绩题型,博主精心整理,值得一读
- 2022-08-01 第八组 曹雨 泛型 枚举
猜你喜欢
程序员必备的 “ 摸鱼神器 ” 来了 !
工程建筑行业数据中台指标分析
2022 edition of MySQL tutorial, top collection good, take your time
How to prevent governance attacks in DAOs?
Shell programming conditional statement
SAP ABAP OData 服务如何支持删除(Delete)操作试读版
Based on php tourism website management system acquisition (php graduation design)
使用分类权重解决数据不平衡的问题
【C语言实现】两种计算平均成绩题型,博主精心整理,值得一读
seaborn笔记:可视化统计关系(散点图、折线图)
随机推荐
HCIP---Architecture of Enterprise Network
使用分类权重解决数据不平衡的问题
0DFS Medium LeetCode6134. Find the closest node to the given two nodes
自建 Prometheus 采集腾讯云容器服务监控数据最佳实践
【ASM】字节码操作 MethodWriter
Delicious this year
VGUgarbage collector(垃圾回收器)的实现原理
Safe fifth after-school exercise
第一讲 测试知多少
小程序容器+自定义插件,可实现混合App快速开发
render-props and higher order components
MySQL相关知识
Getting Started Database Days4
数据分析面试手册《指标篇》
小程序--分包
入门数据库Days4
Spark cluster construction
leetcode 204. Count Primes 计数质数 (Easy)
Still struggling with reporting tool selection?To take a look at this
Today's sleep quality record 74 points