rxjs简单的Observable用例
import React from 'react';
import { Observable } from 'rxjs'; const FlowPage = () => { const onSubscribe = observer => {
observer.next(1);
observer.next(2);
observer.next(3);
} // 创建一个发布者
// Observable是一个特殊类,它接受一个处理Observer的函数
// 而Observer就是一个普通的对象,
// 对于Observer对象要求:它必须包含一个名为next的属性(是一个函数)
// next用于接收被推过来的数据
const source$ = new Observable(onSubscribe); // 参数就是观察者对象
const theObserver = {
next : item => console.log(item)
} // 一个观察者调用Observable对象的subscribe函数
source$.subscribe(theObserver) return <h1>rxjs学习</h1>;
}; export default FlowPage;
跨越时间的Observable
// 推送数据可以有时间间隔。
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
if(number > 3){
clearInterval(Timer)
}
},1000)
}
永无止境的Observable
假如我们不中断这个程序,让它一直运行下去这个程序也不会消耗更多的内存。
Observable对象每次只吐出一个数据,然后这个数据就被Observer消化处理了,不会存在数据的堆积。
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
},1000)
}
Observable的完结
Observer时刻准备着接收数据,如果没有推送数据了,相关的资源不会被释放,为了让Observer明确知道这个数据流已经不会再有新的数据,
需要调用Observer的complete函数。
import React from 'react';
import { Observable } from 'rxjs'; const FlowPage = () => { // 推送数据可以有时间间隔。
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
if(number > 3){
clearInterval(Timer)
observer.complete();
}
},1000)
}
const source$ = new Observable(onSubscribe); const theObserver = {
next : item => console.log(item),
complete:()=> console.log(' no more data')
} source$.subscribe(theObserver) return <h1>rxjs学习</h1>;
}; export default FlowPage;
observable的错误处理
// 一旦进入出错状态,observable就终结了,就不会再调用后面的next()和complete()
// 调用了complete()函数终结,也不能再调用next()和error()
const onSubscribe = observer => {
observer.next(1);
observer.error('something wrong!')
observer.complete()
}
const source$ = new Observable(onSubscribe); const theObserver = {
next : item => console.log(item),
error: err => console.log(err),
complete:()=> console.log(' no more data')
} source$.subscribe(theObserver)
Observable简洁形式
// 为了让代码更加简洁,没有必要创建一个参数对象。
// subscribe也可以直接接受函数作为参数,
// 第一个参数如果是函数类型,就会被认为是next
// 第二参数被认为是error
// 第三个参数complete
source$.subscribe(
item => console.log(item),
err => console.log(err),
()=> console.log(' no more data')
)
Observable退订
// 返回一个对象,并且对象包含了unsubscribe函数,表示退订
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
observer.next(number++)
},1000)
return {
unsubscribe:()=>{
clearInterval(Timer)
}
}
}
const source$ = new Observable(onSubscribe); // subscribe函数的返回结果存为变量subscription
const subscription = source$.subscribe(
item => console.log(item),
err => console.log(err),
()=> console.log(' no more data')
) // 3.5s后调用退订
// 3.5s后不再接受到被推送的数据,但是Observable的source$资源并没有终结
// 因为始终没有调用complete,只不过再也不会调用next函数了
setTimeout(()=>{
subscription.unsubscribe()
},3500)
修改以下代码,便于观察
// 返回一个对象,并且对象包含了unsubscribe函数,表示退订
const onSubscribe = observer => {
let number = 1;
const Timer = setInterval(()=>{
console.log('in onSUbscribe ',number)
observer.next(number++)
},1000)
return {
unsubscribe:()=>{
// clearInterval(Timer)
}
}
}
执行结果如下:

由此可见,Observable对象source$在退订以后依然在不断调用next函数,
但是已经断开了source$对象和Observer的连接。
所以onSubscribe中如何调用next,observer都不会做出任何响应
rxjs简单的Observable用例的更多相关文章
- SSM-MyBatis-01:IDEA的安装,永久注册和简单的MyBatis用例
一,IDEA的安装和永久注册 1.安装: 那到安装包,下一步,选路径,上面可以选操作系统64/32位,下面是程序的默认打开方式,可以不必勾选,也可以全选 路径一定不包含中文,重点 2.永久注册: 将此 ...
- Oracle简单脚本演示样例
Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR VARCHAR2( ...
- rxjs简单入门
rxjs全名Reactive Extensions for JavaScript,Javascript的响应式扩展, 响应式的思路是把随时间不断变化的数据.状态.事件等等转成可被观察的序列(Obser ...
- rxjs 简单的demo
开发环境是使用 create-react-app 创建的.再使用 $ cnpm install rxjs 来安装即可开始. $ npx create-react-app my-app $ cd my- ...
- Appium+python的一个简单完整的用例
最近一直在忙,终于有时间来整理一下,传一个简单的用例,运行之后可以看到用例的报告,希望对大家有帮助. HTMLTestRunner这个包网上有很多,大家可以自己下载. 1 import unittes ...
- C#中的简单工厂和单例
下面首先来说说简单工厂 举个例子: 首先是父类 public abstract class Pizza { public abstract string Info(); } } 子类 public c ...
- 从一个简单的Java单例示例谈谈并发
一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static Un ...
- [Javascript + rxjs] Introducing the Observable
In this lesson we will get introduced to the Observable type. An Observable is a collection that arr ...
- 从一个简单的Java单例示例谈谈并发 JMM JUC
原文: http://www.open-open.com/lib/view/open1462871898428.html 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这 ...
随机推荐
- SpringBoot分布式篇Ⅶ --- 整合Dubbo
在分布式系统中, 国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot,Spring Cloud. 分布式系统: 一.Zookeepe ...
- 有基因ID或者基因名,如何拿到对应的KEGG通路图?
1.https://www.kegg.jp/kegg/tool/map_pathway2.html 2.如下图,筛选出基因所在的通路,并标上不同的颜色. 3.结果页面如下,有些基因会找不到对应的通路, ...
- JDK的下载及安装教程图解(超详细哦~)
一.本人电脑系统介绍及JDK下载途径 1.先说明一下我的电脑为win10系统,64位操作系统~ 2.我选择下载的JDK版本为1.8版本.给大家来两个下载渠道,方便大家的下载~ JDK官网:https: ...
- GetModuleFileNameEx遍历获取64bit程序路径失败的一种解决方法(Win7-64-bit)
问题: 32位程序在64位系统上调用GetModuleFileNameEx()遍历获取64位进程的全路径失败,得到的路径都为空. 根据官方的说法: For the best results use t ...
- 未来JDK中将不再包含JDBC-ODBC桥
今天才发现一个重要问题,java中居然没有这个桥了.让初学者真的泪流了! 甲骨文公司主要技术人员.JDBC规范领导者Lance Andersen今天在博客中称,从Java SE 8(java 1.8版 ...
- Go语言实现:【剑指offer】栈的压入、弹出序列
该题目来源于牛客网<剑指offer>专题. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5 ...
- 【算法】混合流体模拟demo
展示一个流体模拟算法的实现 地址:http://www.iqiyi.com/w_19rzs1anol.html 采用C++编写,Blender渲染. 截图 参考文献 REN, B., LI, C., ...
- 使用chrome控制台调试js代码
1.打开控制台(空白页签即可) 2.将控制台在独立页打开(点击控制台右上角的三个点图标,然后点击如下图中的图标) 3.创建脚本编辑页面 4.页面区域说明 5.花键+回车之行代码 6.常用命令介绍 6. ...
- 小记centos7.5下yum安装cobbler遇到的问题
问题1:执行cobbler sync同步命令报错,提示dhcpd服务错误和Python源码错误 [root@server ~]# cobbler sync #<===执行cobbler同步的时候 ...
- 对CAN signal 的一点理解
首先每个 ECU是一个网络节点,每个网络节点可收发一些 Message,每个Message 由CAN signals构成.每个 CAN signal利用一个或多个连续的2进制位来表示承载的信息.下 ...