原文地址: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的更多相关文章

  1. 响应式js幻灯片代码一枚

    网站搭建经常会用到js幻灯片轮播,放上几张上档次的美图,为你的爱站增添大气元素.经常看到一些js幻灯片代码,但是感觉不是很美观,有的也不支持自适应缩放,也即是响应式,现在智能手机的普及以及移动浏览器技 ...

  2. ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

    简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模 ...

  3. 响应式编程库RxJava初探

    引子 在读 Hystrix 源码时,发现一些奇特的写法.稍作搜索,知道使用了最新流行的响应式编程库RxJava.那么响应式编程究竟是怎样的呢? 本文对响应式编程及 RxJava 库作一个初步的探索. ...

  4. MobX响应式编程库

    MobX https://mobx.js.org/ https://github.com/mobxjs/mobx MobX is a battle tested library that makes ...

  5. 手机响应式js轮播基础

    onmousedown --->ontuchstart onmousemove --->ontouchmove onmouseup --->ontouchend ontuchstar ...

  6. 响应式js设置

    <script> (function anonymous() { // 声明一个函数,并直接的执行 function computed() { let HTML = document.do ...

  7. 响应式编程(Reactive Programming)(Rx)介绍

    很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...

  8. Vue 数据响应式原理

    Vue 数据响应式原理 Vue.js 的核心包括一套“响应式系统”.“响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码.例如,视图渲染中使用了数据,数据改变后,视图也会自动更新. 举个简单 ...

  9. (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...

随机推荐

  1. org.apache.hadoop.util.Shell demo/例子

    package cn.shell; import java.io.IOException; import org.apache.hadoop.util.Shell; public class Shel ...

  2. 剑指offer15 二进制中1的个数

    题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1.因此,如果输入9则函数输出2. int Number(int n) { ; while ...

  3. ISE 14.7安装教程最新版(Win10安装)

    一.下载 第一步下载首先自己下载好四个压缩包,把第一个解压,其余的三个不用解压,然后去第一个解压后的文件夹打开启动程序. 第二步是点击启动程序后会有以下界面 next到下一个界面,这个时候需要把之前没 ...

  4. c04--数组

    0.展示PTA总分 1.本章学习内容总结 1.1学习内容总结 数组查找: 1.遍历法查找:从头遍历数组找对应数据. 2.二分法查找:适用于按顺序排列的整形数组. 插入数据: 先找到该数据,对数组进行移 ...

  5. pose_graph的优化变量和优化函数

    1.优化变量 优化变量就是vertex,也就是pose,pose-graph的优化目标就是,调整所有vertex的位置来尽量满足所有边的约束. 上述的还是表层的理解,深一步理解: pose-graph ...

  6. Unity开发:5.0+版本标准资源包无内置问题

    一.问题如下: 在Unity中,一般都会内置有基础的资源包,可以在Assets->Import Package中,点击其下的子项进行导入: 但是我发现,5.0版本与之前的4.x版本相比,安装包变 ...

  7. 常用war包插件

    <build> <resources> <resource> <directory>src/main/java</directory> &l ...

  8. 【操作系统之七】Linux常用命令之tail

    一.概念linux tail命令用途是按照要求将指定的文件的最后部分输出到标准设备,一般是终端,就是把某个档案文件的最后几行显示到终端上,如果该档案有更新,tail会自动刷新,确保你看到最新的档案内容 ...

  9. Mercari Price Suggestion in Kaggle

    Mercari Price Suggestion 最近看到了一个竞赛,竞赛的内容是根据已知的商品的描述,品牌,品类,物品的状态等特征来预测商品的价格 最后的评估标准为 平均算术平方根误差Root Me ...

  10. C中关键字inline用法

    一.什么是内联函数 在C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数.栈空间指的是 ...