响应式js库——rxjs
原文地址:https://rxjs.dev/guide/overview
简介
RxJS 是组合异步以及基于事件的使用可观察者序列的程序类库。它提供一个核心类型,Observable,附属类型(Observer,Schedulers,Subjects)并且受到了数组额外操作(map,filter,reduce,every 等等)启发来将异步事件作为集合来处理。
可以理解为 RxJS 就是事件的 Loadsh
ReactiveX 结合了观察者模式,迭代模式以及集合式的函数事编程来满足对管理事件的需求。
RxJS 解决异步事件的管理的基本概念是:
- Observable(可观察的):表示可调用的值或事件的集合
- Observer(观察者):回调的集合,它知道怎么去监听 Observable 派送(传递)的值
- Subscription(订阅):表示 Observable 的执行,主要的用途取消执行
- Operators(操作者):是一个纯粹的功能,它以一种函数式编程风格来处理集合的操作,就像数组的
map,concat,filter,reduce
等等 - Subject(主题):这个等价于一个事件触发器(EventEmitter),只能以多播的方式传递值或事件给多个多个观察者(Observers)
- Schedulers(调度者):是控制并发的集中式调度程序,允许我们调节当电脑发生了如
setTimeout
或是requestAnimationFrame
以及其他的时候
第一个例子
你一般注册的一个事件侦听是这样的:
document.addEventListener('click', () => console.log('Clicked!'));
使用 RxJS 你可以创建一个可观察的对象来替代:
import { fromEvent } from 'rxjs';
fromEvent(document, 'click').subscribe(() => console.log('Clicked!'));
纯粹(Purity)
RxJS 之所以强大,是因为它能使用纯函数来生成值。也就是说你的代码很少发生错误。
通常你会新建一个非纯函数,在你的代码片段里面会混乱你自己的状态
let count = 0;
document.addEventlistener('click', () => console.log(`Clicked ${++count} times`));
而 RxJS 会隔离你的状态
import { fromEvent } from 'rxjs';
import { scan } from 'rxjs/operators';
fromEvent(document, 'click')
.pipe(scan(count => count + 1, 0))
.subscribe(count => console.log(`Click ${count} times`));
scan 操作的工作就像数组的 reduce 一样。它会传递一个值给回调函数。回调函数会返回一个值,并且返回的值将成为下一次回调运行传递的下一个值。
流(Flow)
RxJS 有一个完整的操作符,它们都能帮助你通过你的 ovservables 控制事件流。
下面这段代码就是展示你将允许每秒最多一次点击之后,用原生 javascript
let count = 0;
let rate = 1000;
let lastClick = Date.now() - rate;
document.addEventListener('click', () => {
if(Date.now() - lastClick >= rate){
console.log(`Click ${++count} times`);
lastChild = Date.now();
}
});
RxJS:
import { fromEvent } from 'rxjs';
import { throttleTime, scan } from 'rxjs/operators';
fromEvent(document, 'Click')
.pipe(
throttleTime(1000),
scan(count => count + 1, 0)
)
.subscribe(count => console.log(`Click ${count} times`));
还有其他的流控制像 filter,delay,debounceTime,take,takeUtil,distinct,distinctUntilChanged
等等。
值
你可以在你自己的可观察对象之间传递值
这里告诉你怎么在每次点击的时候加当前鼠标的 x 坐标,用 javascript 代码:
let count = 0;
const rate = 1000;
let lastClick = Date.now() - rate;
document.addEventListener('click', event => {
if (Date.now() - lastClick >= rate) {
count += event.clientX;
console.log(count);
lastClick = Date.now();
}
});
用 RxJS:
import { fromEvent } from 'rxjs';
import { throttleTime, map, scan } from 'rxjs/operators';
fromEvent(documeht, 'click')
.pipe(
throttleTime(1000),
map(event => event.clientX),
scan((count, clientX) => count + clientX, 0)
)
.subscribe(count => console.log(count));
其他产生值的操作还有 pluck,pairwise,sample
等
响应式js库——rxjs的更多相关文章
- 响应式js幻灯片代码一枚
网站搭建经常会用到js幻灯片轮播,放上几张上档次的美图,为你的爱站增添大气元素.经常看到一些js幻灯片代码,但是感觉不是很美观,有的也不支持自适应缩放,也即是响应式,现在智能手机的普及以及移动浏览器技 ...
- ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!
简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模 ...
- 响应式编程库RxJava初探
引子 在读 Hystrix 源码时,发现一些奇特的写法.稍作搜索,知道使用了最新流行的响应式编程库RxJava.那么响应式编程究竟是怎样的呢? 本文对响应式编程及 RxJava 库作一个初步的探索. ...
- MobX响应式编程库
MobX https://mobx.js.org/ https://github.com/mobxjs/mobx MobX is a battle tested library that makes ...
- 手机响应式js轮播基础
onmousedown --->ontuchstart onmousemove --->ontouchmove onmouseup --->ontouchend ontuchstar ...
- 响应式js设置
<script> (function anonymous() { // 声明一个函数,并直接的执行 function computed() { let HTML = document.do ...
- 响应式编程(Reactive Programming)(Rx)介绍
很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...
- Vue 数据响应式原理
Vue 数据响应式原理 Vue.js 的核心包括一套“响应式系统”.“响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码.例如,视图渲染中使用了数据,数据改变后,视图也会自动更新. 举个简单 ...
- (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...
随机推荐
- Arduino读取ph试剂浓度
https://detail.tmall.com/item.htm?id=600904840315&spm=a1z09.2.0.0.31cd2e8d1sb06V&_u=e1qf7bf5 ...
- <虚树+树型DP> SDOI2011消耗战
<虚树+树型DP> SDOI2011消耗战 #include <iostream> #include <cstdio> #include <cstring&g ...
- PATB1024科学计数法
代码是部分正确,只得了13分还有两个测试点没有通过,不知道原因是啥,先不深究了,赶进度. 参考代码: #include<cstdio> #include<cstring> #i ...
- CF264D - Colorful Stones 题解
题面 官方题解 模拟赛题解 题解概述: 定义符号A~B表示序列A是序列B的子序列,A!~B反之. 设操作序列为I,则有A~I,B!~I,C~I,D!~I. 可得出条件①B!~C且D!~A,所以我们只要 ...
- javaWeb如何转发数据,jsp页面如何接收?
1.情景展示 现在有一个需求就是:请求达到服务器后,服务器需要将请求的数据传给另一个页面,如何实现? 2.目标分析 通过服务器跳转到页面上,有两种实现方式:一种是转发,一种是重定向. 我们知道转发 ...
- Go:为何带来泛型
中文版 English version 介绍 [这是在Gophercon 2019上发表的演讲版本.视频链接可供使用.] 这篇文章是关于向Go添加泛型的意义,以及为什么我认为我们应该这样做.我还将介绍 ...
- Kubernetes集群之清除集群
清除K8s集群的Etcd集群 操作服务器为:192.168.1.175/192.168.1.176/192.168.1.177,即etcd集群的三台服务器.以下以192.168.1.175为例子. 暂 ...
- AI保存文件出现了未知错误 (Adobe Illustrator)
可能的原因如下:1 把文件中所有的文字全选,转成曲线,把所有的文字都创建成轮廓2 新建一个页面,把制作的复制到新页面里3 需要把图层全部解锁再保存4 没有权限,设置一下即可5 PRINT SPOOLE ...
- [原创]UnLua Emmylua UE4开发环境搭建
前言 公司开发的第二个虚幻4项目已经上线了,慢慢趋于稳定.回想起开荒的日子,历历在目.从引擎脚本的选择,各工具(导表,协议生成...)的重构.开发, 引擎扩展(多骨骼支持,Notify扩展,技能编辑器 ...
- 【C/C++开发】c++ 工具库 (zz)
下面是收集的一些开发工具包,主要是C/C++方面的,涉及图形.图像.游戏.人工智能等各个方面,感觉是一个比较全的资源.供参考! 原文的出处:http://www.codemonsters.de/ho ...