使用场景

  1. 在复杂的,频繁的异步请求场景,使用rxjs。
  2. 在依赖的多个异步数据,决定渲染的情景,使用rxjs。

总之:在前台频繁的、大量的、和后台数据交互的复杂项目里面,使用rxjs(web端,iOS,android端等,客户端都可考虑使用)

rxjs初步认识

  1. 数据和数据观察者的绑定。数据变化,观察者动作——监听或者观察者模式。
  2. 观察者的迭代执行动作——观察者注册任意个异步或同步动作,迭代执行。

hello world

let start = Rx.Observable.create((observer) => {
observer.next('hello world')
});
start.subscribe((a) => {
console.log(a)
}) # >>>
hello world

核心对象(概念)

  1. Observable 可观察对象

    数据,动作等进行包装后,变成observable可观察对象,供observer观察者监听

  2. Observer 观察者

    一些列的回调函数,用来应对Observable的变化。

  3. Subscription (订阅)

    将可观察对象和观察者建立起关系。

  4. Operator(操作符)

    库提供的方法,强大。就像js数组提供了map、filter、reduce等方法一样。

  5. subject(主体)

    subject像是维护着一个监听者的注册表。

    当有新的事件发生时,广播给各个监听者。

  6. Schedulers (调度器)

    先不管,目前没用到,也不影响使用

基本示例

1

let firstObservable = Rx.of('one', 'two');
firstObservable.subscribe((a) => {
console.log(a)
}) firstObservable.subscribe((a) => {
console.log(a+'-222')
}) # >>>
one
two
one-222
two-222

2

let secondObservable = Rx.Observable.create((data) => {
let a = 0;
//模拟异步请求
setInterval(() => {
data.next(a)
a += 1
}, 1000)
});
console.log('just before subscribe');
secondObservable.subscribe((a) => {
console.log(a + '11')
});
secondObservable.subscribe({
next: x => console.log('got value ' + x),
error: err => console.error('something wrong occurred: ' + err),
complete: () => console.log('done'),
});
console.log('just after subscribe'); # >>>
just before subscribe
just after subscribe
011
got value 0
111
got value 1
211
got value 2
311
got value 3
...

3, subject

let firstObservable = Rx.of('one', 'two');
firstObservable.subscribe((a) => {
console.log(a)
});
firstObservable.subscribe((a) => {
console.log(a+'-222')
}) var subject = new Rx.Subject(); subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
}); subject.next(1);
subject.next(2); #>>> one
two
one-222
two-222
observerA: 1
observerB: 1
observerA: 2
observerB: 2

状态控制

监听input输入框得变化,控制处理动作的流动或者规则

    var input = Rx.Observable.fromEvent(document.querySelector('input'), 'input');

    // 过滤掉小于3个字符长度的目标值
input.filter(event => event.target.value.length > 2)
.map(event => event.target.value)
.subscribe(value => console.log(value)); //延迟200毫秒
input.delay(200)
.map(event => event.target.value)
.subscribe(value => console.log(value)); //一秒内触发一次
input.throttleTime(1000)
.map(event => event.target.value)
.subscribe(value => console.log('一秒内触发一次-throttleTime' + value)); // 停止输入后200ms方能通过最新的那个事件
input.debounceTime(1000)
.map(event => event.target.value)
.subscribe(value => console.log('停止输入1000毫秒后-debounceTime' + value)); //处理三次后停止
input.take(3)
.map(event => event.target.value)
.subscribe(value => console.log('3次事件后停止流' + value)); // 直到其他 observable 触发事件才停止事件流
var stopStream = Rx.Observable.fromEvent(document.querySelector('button'), 'click');
input.takeUntil(stopStream)
.map(event => event.target.value)
.subscribe(value => console.log('button' + value)); // "hello" (点击才能看到)

产生值


//输入 hello world var input = Rx.Observable.fromEvent(document.querySelector('input'), 'input'); // 传递一个新的值
input.map(event => event.target.value)
.subscribe(value => console.log('map'+value)); // 通过提取属性传递一个新的值---将对象的一个值提取出来
input.pluck('target', 'value')
.subscribe(value => console.log('pluck'+value)); // 传递之前的两个值
input.pluck('target', 'value').pairwise()
.subscribe(value => console.log('pluck/pairwise'+value)); // ["h", "he"] // 只会通过唯一的值--一次输出一个且历史上重复输入,不会输出。
input.pluck('data').distinct()
.subscribe(value => console.log('distinct'+value)); // "helo wrd" // 不会传递重复的值,上一个和当前值
input.pluck('data').distinctUntilChanged()
.subscribe(value => console.log('distinctUntilChanged'+value)); // "helo world"

应用状态的保持

rxjs使用的是纯函数。但是应用是有状态的,可以使用scan来累计状态

    var button = document.querySelector('button');
Rx.Observable.fromEvent(button, 'click')
// 对流进行 scan (reduce) 操作,以获取 count 的值
.scan(count => count + 1, 0)
// 每次改变时都在元素上设置 count
.subscribe(count => document.querySelector('#count').innerHTML = count); //使用merge将多个observables 合并在一起,监听处理
var increaseButton = document.querySelector('#increase');
var increase = Rx.Observable.fromEvent(increaseButton, 'click')
// 我们再一次映射到一个函数,它会增加 count
.map(() => state => Object.assign({}, state, {count: state.count + 1})); var decreaseButton = document.querySelector('#decrease');
var decrease = Rx.Observable.fromEvent(decreaseButton, 'click')
// 我们还是映射到一个函数,它会减少 count
.map(() => state => Object.assign({}, state, {count: state.count - 1})); var inputElement = document.querySelector('#input');
var input = Rx.Observable.fromEvent(inputElement, 'keypress')
// 我们还将按键事件映射成一个函数,它会产生一个叫做 inputValue 状态
.map(event => state => Object.assign({}, state, {inputValue: event.target.value})); // 我们将这三个改变状态的 observables 进行合并
var state = Rx.Observable.merge(
increase,
decrease,
input
).scan((state, changeFn) => changeFn(state), {
count: 0,
inputValue: ''
}); // 我们订阅状态的变化并更新 DOM
state.subscribe((state) => {
document.querySelector('#count').innerHTML = state.count;
document.querySelector('#hello').innerHTML = 'Hello ' + state.inputValue;
});

rxjs入门指南的更多相关文章

  1. Webpack 入门指南 - 3. Hello, Angular2!

    Webpack 入门指南 - 1.安装 Webpack 入门指南 - 2.模块 这一次,我们使用 Webpack 来打包 Angular 2 的应用. 与官方的 Hello, Angular 2 项目 ...

  2. Web API 入门指南 - 闲话安全

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  3. Vue.js 入门指南之“前传”(含sublime text 3 配置)

    题记:关注Vue.js 很久了,但就是没有动手写过一行代码,今天准备入手,却发现自己比菜鸟还菜,于是四方寻找大牛指点,才终于找到了入门的“入门”,就算是“入门指南”的“前传”吧.此文献给跟我一样“白痴 ...

  4. yii2实战教程之新手入门指南-简单博客管理系统

    作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...

  5. 【翻译】Fluent NHibernate介绍和入门指南

    英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...

  6. ASP.NET MVC 5 入门指南汇总

    经过前一段时间的翻译和编辑,我们陆续发出12篇ASP.NET MVC 5的入门文章.其中大部分翻译自ASP.NET MVC 5 官方教程,由于本系列文章言简意赅,篇幅适中,从一个web网站示例开始讲解 ...

  7. 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍

    我们在前一篇文章微软新神器-Power BI,一个简单易用,还用得起的BI产品中,我们初步介绍了Power BI的基本知识.由于Power BI是去年开始微软新发布的一个产品,虽然已经可以企业级应用, ...

  8. 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据

    我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...

  9. 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模

    我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...

随机推荐

  1. asp.net core-16.EF Core Migration

    左边的是基于visual studio code 右边的是基于visual studio 如果想要在数据库的AspNetUsers表里添加一列 然后可以发现 在Data下的Migrations文件夹下 ...

  2. vue 集成jTopo 处理方法

    jTopo 帮助说明网站 http://www.jtopo.com/index.html 使用例子: http://www.jtopo.com/demo/helloworld.html 不建议直接安装 ...

  3. Https请求被中止: 未能创建 SSL/TLS 安全通道

    可以参考https://www.cnblogs.com/ccsharp/p/3270344.html 和https://blog.csdn.net/baidu_27474941/article/det ...

  4. Windows 下 mysql 5.7 设置 区分大小写(敏感),设置默认编码 utf8mb4

    修改编码 c盘下搜索 C:\ProgramData\MySQL\MySQL Server 5.7 在该my.ini文件下进行配置修改 [client] default-character-set = ...

  5. XXX银行人事管理系统-数据库设计

    1. 用户.权限.角色关系用户基本信息 userinfo [人员表]权限表actions[权限表]员工类型表usertype [管理组表]权限映射表actionmapping [权限映射表]权限分栏表 ...

  6. Linux增加虚拟内存

    Docker容器启动Mysql镜像报错,提示无法分配内存,报错信息如下: 由此我们看到Swap为0,考虑适当增加swap. Linux开启swap空间有好几种方法,在这里只介绍比较常用的两种. 使用交 ...

  7. Python中的一些常用模块1

    OS模块,sys模块,time模块,random模块,序列化模块 os模块是与操作系统交互的一个接口 OS模块简单的来说是一个Python的系统编程操作模块,可以处理文件和目录这些我们日常手动需要做的 ...

  8. 最全排序算法原理解析、java代码实现以及总结归纳

    算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过 ...

  9. 阿里高级架构师教你使用Spring JMS处理消息事务源码案例

    消费者在接收JMS异步消息的过程中会发生执行错误,这可能会导致信息的丢失.该源码展示如何使用本地事务解决这个问题.这种解决方案可能会导致在某些情况下消息的重复(例如,当它会将信息储存到数据库,然后监听 ...

  10. python的set集合去重功能

    # -*- coding:utf-8 -*- setData=set([]) #第一种方式,通过add()添加元素 setData.add('china\n') setData.add('turky\ ...